2019年9月1日 星期日

Java 9 功能

※Module



新建一個專案,然後增加兩個 module,如上圖,Module1 和 Module2
在 Module1 增加 class M1;Module2 增加 class M2
M1 想用 M2 預設是沒辦法的,所以在兩個 module 的 src 按右鍵增加 module-info

1.M2 要給別人用,所以要匯出,都是以 package 為單位
module Module2 {
    exports xxx.ooo;
}

2.M1 要用別人的,所以要要求使用,如果要用 java 內鍵的,按下 content assist 會有提示
module Module1 {
    requires Module2;
}

3.此時還是會編譯錯誤,還得如下使用:

4.好文章


※介面可用 private 方法


※String 和 AbstractStringBuilder 

從 char[] 改成 byte[],AbstractStringBuilder 是 StringBuffer 和 StringBuilder 的抽象父類別


※jshell

java 的 shell,在安裝目錄的 bin 裡,每次要測簡單的東西,都要寫 class,然後在寫個 main 方法是很累人的,所以直接在裡面打即可
1.除了 java.lang 外,打 /imports 是預設有 import 的
2.不用 try catch
3.屬性和方法會後者蓋前者



※省略泛型和增強 try-with-resource

new Comparable<>(){
@Override
public int compareTo(Object o) {
return 0;
}
};

※在 java 7 就可以省略 <> 裡的東西了,但匿名類別不行,在這一版可以了


InputStreamReader isr = new InputStreamReader(System.in);
try(isr) {

} catch(Exception e) {

}

※在 java 7 就可以有 try () 了,但宣告都要在裡面才行,在這一版可以寫在外面,裡面寫變數名稱即可

※不能改 try 裡的東西,裡面是 final 的



※不可變的可讀集合

List.of(1, 2, 3, 4, 5);
Set.of(1, 1, 2, 2, 3);
Map.of("a", 1, "b", 2);
Map.ofEntries(Map.entry("c", 3), Map.entry("d", 4));



※Optional 增加 3 個方法

.stream
List<Integer> list = List.of(1, 2, 3);
Optional<List<Integer>> oList = Optional.ofNullable(list);
Stream<List<Integer>> stream = oList.stream();

※回傳的和 Optional 的泛型一樣

.or
Optional<Integer> op = Optional.ofNullable(null);
op = op.or(() -> Optional.of(7));
System.out.println(op.get());

※如果不是 null 就回傳,否則就回傳 7


.ifPresentOrElse
Optional<Integer> op = Optional.ofNullable(null);
op.ifPresentOrElse(x -> System.out.println("x=" + x), () -> System.out.println("hahaha"));

※回傳 x 或 hahaha


※Stream 增加 4 個方法

Stream.iterate(0, n -> n < 10, n -> ++n).forEach(System.out::println);

※這是個 overloading 方法,java 8 只有一個,要加 limit 才不會變成無限流,現在有了中間參數是 Predicate,可以不用 limit 了


Stream.of(1, 2, 6, 7, 4, 3).takeWhile(n -> n < 6).forEach(System.out::println); // 1 2
Stream.of(1, 2, 6, 7, 4, 3).dropWhile(n -> n < 6).forEach(System.out::println); // 6 7 4 3
takeWhile:從第一個開始判斷,如果條件成立( < 6),就抓,但只要條件不成立,馬上返回 (雖然後面也有條件成立的,但不管)

dropWhile:takeWhile 的相反,從第一個開始判斷,如果條件成立就刪除,但只要條件不成立,馬上返回 (雖然後面也有條件成立的,但不管)

Stream.of(null, null).count(); // 2 這個不是新增的,如果有兩個以上 (包括兩個) 的元素,不會報錯,但如果只有一個 null,會報空指針,所以可以用新方法 ofNullable,但回傳的是 0
Stream.ofNullable(null).count(); // 0



※ElementType 增加 MODULE

使用在 module-info 裡,例子可看這篇最下面

沒有留言:

張貼留言