Java 8 中主要的新特性有4個。java
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); } }
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 引入了模塊系統,而且將 JDK 也進行了模塊化。在之前,無論咱們作什麼項目(有可能就是很小的一個demo項目)都須要包含 JDK 中全部的包,這樣會致使程序包很是大。將 JDK 模塊化後,當用到某些模塊時,之引入具體的模塊,這樣會大大減少程序包。
JDK 9 中一共由 94 個模塊組成,經過新增的 jlink
工具能夠建立出每一個應用獨有的 Java 運行時鏡像。
Java 9 增長了新特性 jshell
,在 jshell 中能夠直接輸入表達式並查看執行結果。
當咱們須要測試一個方法的運行效果,或是快速的對錶達式進行求值時,jshell 都很是實用。
在集合中, 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"); } }
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 了,它可以幫助咱們更加快速地編寫簡潔的代碼。可是使用 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 10 雖然引入了 var 保留字,可是其不能在 Lambda 中聲明使用,在 Java 11 中克服了這一弊端。
示例:
// (var x, var y) -> x.process(y) // 等價於 // (x, y) -> x.process(y)
Java 11 中將 HttpClient 變成了原生的,在這以前,咱們使用 HttpClient時,須要引入 apache 的包。