Java9新特性
阿新 • • 發佈:2020-08-26
模組化技術
模組由通常的類和新的模組宣告檔案(module-info.java)組成。 該檔案是位於 java 程式碼結構的頂層,該模組描述符明確地定義了我們的模組需要什麼依賴關係,以及哪些模組被外部使用
設計目的
- 減少記憶體的開銷
- 只須必要模組,而非全部jdk模組,可簡化各種類庫和大型應用的開發和維護
- 改進 Java SE 平臺,使其可以適應不同大小的計算裝置
- 改進其安全性,可維護性,提高效能
使用舉例
/** * requires:指明對其它模組的依賴 */ module java9demo { requires java9test; requires java.logging; requires junit; } /** * exports:控制著哪些包可以被其它模組訪問到。所有不被匯出的包 預設都被封裝在模組裡面 */ module java9test { exports com.liuhuan.study; }
jShell命令
設計目的
即寫即得、快速執行
使用舉例
呼叫命令
獲取幫助
基本使用
導包
預設已經匯入的包
使用外部編輯器編寫程式碼
退出
介面中的私有方法
Java 8 中規定介面中的方法除了抽象方法之外,還可以定義靜態方法和預設的方法。一定程度上,擴充套件了介面的功能,此時的介面更 像是一個抽象類。在 Java 9 中,介面更加的靈活和強大,連方法的訪問許可權修飾符都可以宣告為 private 的了,此時方法將不會成為你對外暴露的 API 的一部分
使用舉例
public interface MyInterface { void normalInterfaceMethod(); default void methodDefault1() { init(); } private void init() { System.out.println("預設方法中的通用操作"); } } class MyInterfaceImpl implements MyInterface { @Override public void normalInterfaceMethod() { System.out.println("實現介面的方法"); } public static void main(String[] args) { MyInterface impl = new MyInterfaceImpl(); impl.methodDefault1(); } }
鑽石操作符(Diamond Operator)使用升級
能夠在匿名實現類中使用鑽石操作符
使用舉例
private List<String> flattenStrings(List<String>... lists) { Set<String> set = new HashSet<>() {}; for (List<String> list : lists) { set.addAll(list); } return new ArrayList<>(set); }
try語句關閉資源
使用舉例
InputStreamReader reader = new InputStreamReader(System.in);
OutputStreamWriter writer = new OutputStreamWriter(System.out);
//reader、writer使用之後會自動關閉
try(reader;writer){
//reader、writer 是 final 的,不可再被賦值
}catch (IOException e){
e.printStackTrace();
}
String、StringBuffer、StringBuilder儲存結構變更
String儲存結構由char變更為byte,增加了一個字元編碼的表識,對於儲存非中文字元可以減少一半的儲存空間
java8
/** The value is used for character storage. */
private final char value[];
java9
private final byte[] value;
集合工廠方法:快速建立只讀集合
使用舉例
List<String> list = List.of("a", "b", "c"); Set<String> set = Set.of("a", "b", "c");
Map<String, Integer> map1 = Map.of("Tom", 12, "Jerry", 21, "Lilei", 33, "HanMeimei", 18);
Map<String, Integer> map2 = Map.ofEntries( Map.entry("Tom", 89),
Map.entry("Jim", 78),
Map.entry("Tim", 98)
);
Stream API增強
takeWhile()的使用:
用於從 Stream 中獲取一部分資料,接收一個 Predicate 來進行選擇。在有序的 Stream 中,takeWhile 返回從開頭開始的儘量多的元素
List<Integer> list = Arrays.asList(45,43,76,87,42,77,90,73,67,88);
list.stream().takeWhile(x -> x < 50)
.forEach(System.out::println);
System.out.println();
list = Arrays.asList(1,2,3,4,5,6,7,8);
list.stream().takeWhile(x -> x < 5)
.forEach(System.out::println);
dropWhile()的使用:
dropWhile 的行為與 takeWhile 相反,返回剩餘的元素。
List<Integer> list = Arrays.asList(45,43,76,87,42,77,90,73,67,88);
list.stream().dropWhile(x -> x < 50)
.forEach(System.out::println);
System.out.println();
list = Arrays.asList(1,2,3,4,5,6,7,8);
list.stream().dropWhile(x -> x < 5)
.forEach(System.out::println);
ofNullable()的使用:
Java 8 中 Stream 不能完全為 null,否則會報空指標異常。而 Java 9 中的ofNullable 方法允許我們建立一個單元素 Stream,可以包含一個非空元素,也可 以建立一個空 Stream
//報 NullPointerException
//Stream<Object> stream1 = Stream.of(null);
//System.out.println(stream1.count());
//不報異常,允許通過
Stream<String> stringStream = Stream.of("AA", "BB", null);
System.out.println(stringStream.count());//3
//不報異常,允許通過
List<String> list = new ArrayList<>();
list.add("AA");
list.add(null);
System.out.println(list.stream().count());//2
//ofNullable():允許值為 null
Stream<Object> stream1 = Stream.ofNullable(null);
System.out.println(stream1.count());//0
Stream<String> stream = Stream.ofNullable("hello world");
System.out.println(stream.count());//1
iterator()過載的使用
//原來的控制終止方式:
Stream.iterate(1,i -> i + 1).limit(10).forEach(System.out::println);
//現在的終止方式:
Stream.iterate(1, i -> i < 100, i -> i + 1) .forEach(System.out::println);
Optional 類中 stream()的使用:
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jerry");
list.add("Tim");
Optional<List<String>> optional = Optional.ofNullable(list);
Stream<List<String>> stream = optional.stream();
stream.flatMap(x -> x.stream()).forEach(System.out::println);