Java 各個版本中的新特性

Java 8

Java 8 中主要的新特性有4個。java

Lambda 表達式

Lambda 表達式容許將函數做爲一個方法的參數,即把函數做爲參數傳遞進方法中。程序員

示例以下:web

public class Lambda {
    public static void main(String[] args) {
        // 類型聲明
        MathOperation addition = (int a, int b) -> a + b;
        // 不用聲明類型
        MathOperation subtraction = (a, b) -> 0;
        // 大括號中的返回語句
        MathOperation multiplication = (int a, int b) -> { return a * b; };
        // 沒有大括號及返回語句
        MathOperation division = (int a, int b) -> a / b;

        Lambda lambda = new Lambda();
        System.out.println(lambda.operate(1,2,addition));

    }

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GrecetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation) {
        return mathOperation.operation(a, b);
    }
}

接口增長默認方法等

在 Java 8 之前,接口中只能有常量和抽象方法,不能含有方法的實現。可是在 Java 8 中,咱們能夠對接口添加默認實現,還能夠實現靜態方法。sql

示例:shell

public class InterfaceDefault {
    public static void main(String[] args) {
    }

    class LogOracle implements logging {
    }

    interface logging {
        String ORACLE = "Oracle_Database";
        String MYSQL = "Mysql_Database";

        default void logInfo(String message) {
            getConnection();
            System.out.println("Log Message : " + "INFO");
            closeConnection();
        }

        static void getConnection() {
            System.out.println("Open Database connection");
        }

        static void closeConnection() {
            System.out.println("Close Database connection");
        }
    }

}

方法引用

方法引用經過方法的名字來指向一個方法.apache

示例:小程序

public class MethodReference {
    public static void main(String[] args) {f
        // 方法引用使用一對冒號 :: 來實現
        List names = new ArrayList();

        names.add("Google");
        names.add("Runoob");
        names.add("Taobao");
        names.add("Baidu");
        names.add("Sina");
        
        names.forEach(System.out::println);
    }
}

流 Stream

Java 8 API 添加了一個稱爲流 Stream 的新的抽象,經過使用 Stream 能夠提升程序員的生產力,讓程序員寫出高效、乾淨、簡潔的代碼。dom

流 Stream 將要處理的元素集合看做一種流,流能夠在管道中傳輸,而且能夠在管道的節點上進行處理,好比過濾篩選,排序,聚合等。svg

示例:模塊化

public class Stream {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
        System.out.println("列表: " + strings);

        long count = strings.stream().filter(string -> string.isEmpty()).count();
        System.out.println("空字符串數量爲: " + count);

        count = strings.stream().filter(string -> string.length() == 3).count();
        System.out.println("字符串長度爲 3 的數量爲: " + count);

        List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("篩選後的列表: " + filtered);

        String collect = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
        System.out.println("合併字符串:" + collect);

        //*********************//

        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        List<Integer> integers = Arrays.asList(1, 2, 13, 4, 15, 6, 17, 8, 19);

        List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        System.out.println("Squares List: " + squaresList);
        System.out.println("列表: " + integers);

        IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();

        System.out.println("列表中最大的數 : " + stats.getMax());
        System.out.println("列表中最小的數 : " + stats.getMin());
        System.out.println("全部數之和 : " + stats.getSum());
        System.out.println("平均數 : " + stats.getAverage());
        System.out.println("隨機數: ");

        // 輸出10個隨機數
        Random random = new Random();

        for (int i = 0; i < 10; i++) {
            System.out.println(random.nextInt());
        }

        random.ints().limit(10).sorted().forEach(System.out::println);

        // 並行處理
        count = strings.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("空字符串的數量爲: " + count);
    }
}

Java 9

Java 9 中最值得關注的就是引入了模塊系統,還有其餘一些特性以下。

模塊系統

Java 9 引入了模塊系統,而且將 JDK 也進行了模塊化。在之前,無論咱們作什麼項目(有可能就是很小的一個demo項目)都須要包含 JDK 中全部的包,這樣會致使程序包很是大。將 JDK 模塊化後,當用到某些模塊時,之引入具體的模塊,這樣會大大減少程序包。

JDK 9 中一共由 94 個模塊組成,經過新增的 jlink 工具能夠建立出每一個應用獨有的 Java 運行時鏡像。

交互式工具jshell

Java 9 增長了新特性 jshell ,在 jshell 中能夠直接輸入表達式並查看執行結果。
當咱們須要測試一個方法的運行效果,或是快速的對錶達式進行求值時,jshell 都很是實用。

.of() 建立不可變集合

在集合中, java 9 增長了 List.of()、Set.of()、Map.of() 等工廠方法來建立不可變集合。在這以前,若是咱們須要建立不可變集合,須要藉助 Collections.unmodifiableSet() 等方法來實現。

接口支持私有方法

在 Java 8 中,接口引入了新的支持 一一 默認方法和靜態方法。
在 Java 9 中,接口又引入了對私有方法的支持。
示例:

interface logging {
        String ORACLE = "Oracle_Database";
        String MYSQL = "Mysql_Database";

        private void log(String message, String prefix) {
            getConnection();
            System.out.println("Log Message : " + prefix);
            closeConnection();
        }

        default void logInfo(String message) {
            log(message, "INFO");
        }

        static void getConnection() {
            System.out.println("Open Database connection");
        }

        static void closeConnection() {
            System.out.println("Close Database connection");
        }
    }

更好的 Try-with-resource 體驗

Java 7 引入了 Try-with-resource,使得咱們能夠更方便地對資源進行關閉,可是咱們必須得對資源對象進行聲明。
Java 9 中去除了這一限制,使得對資源的管理更加方便。
示例:

private static String beforeJava9(String message) throws IOException {
        Reader inputString = new StringReader(message);
        BufferedReader br = new BufferedReader(inputString);
        try (BufferedReader br1 = br) {
            return br1.readLine();
        }
    }

    private static String Java9(String message) throws IOException {
        Reader inputString = new StringReader(message);
        BufferedReader br = new BufferedReader(inputString);
        try (br) {
            return br.readLine();
        }
    }

Java 10

局部變量類型推斷 var

Java 10 中我以爲最值得說的就屬局部變量類型推斷 var 了,它可以幫助咱們更加快速地編寫簡潔的代碼。可是使用 var 使得咱們不容易分辨變量的類型,利弊各有吧。
示例:

public class LocalVariableTypeInference {
    public static void main(String[] args) {
        var list = new ArrayList<String>();
        list.add("2");
        System.out.println(list.toString());
        var stream = list.stream();
        System.out.println(stream.toString());
    }
}

Java 11

var 支持 Lambda

Java 10 雖然引入了 var 保留字,可是其不能在 Lambda 中聲明使用,在 Java 11 中克服了這一弊端。
示例:

// (var x, var y) -> x.process(y)
//  等價於
//  (x, y) -> x.process(y)

標準化的 HTTP Client API

Java 11 中將 HttpClient 變成了原生的,在這以前,咱們使用 HttpClient時,須要引入 apache 的包。

相關文章
相關標籤/搜索