2019年9月1日 星期日

java 10 功能

※var

var i = 11;
只能寫在區域變數且一定要賦非 null 的值
var j = new int[]{1,2,3}; // new int[] 不能省略
可以寫在 lambda 的參數,但 lambda 本來就可以省略,多此一舉
可以寫在迴圈,新舊都可以
不能寫在方法的參數和回傳值


※Optional 增加 1 個方法

.orElseThrow
Integer integer = Optional.ofNullable(1).orElseThrow(NullPointerException::new);

如果是 null 就會報 orElseThrow 裡寫的 exception



※List.copyOf

List<Integer> list1 = List.of(1, 2, 3);
List<Integer> copyList1 = List.copyOf(list1);
System.out.println(list1 == copyList1); // true

List<Integer> list2 = Stream.of(1, 2, 3).collect(Collectors.toList());
List<Integer> copyList2 = List.copyOf(list2);
System.out.println(list2 == copyList2); // false

※此方法只會複製不可變的,所以如果本來就是不可變的,底層會判斷能不能 instanceof成 AbstractImmutableList,傳回來會不一樣

※copyOf 是淺複製

class Animal {
    private int id;

// getter/setter

    public Animal(int id) {
        this.id = id;
    }
}

List<Animal> animals = List.of(new Animal(1), new Animal(2), new Animal(3));
List<Animal> copyAnimals = List.copyOf(animals);
System.out.println(animals == copyAnimals); // true

animals.forEach(a -> System.out.println(a.getId())); // 1 2 3
animals.get(0).setId(3);
animals.forEach(a -> System.out.println(a.getId())); // 3 2 3
copyAnimals.forEach(a -> System.out.println(a.getId())); // 3 2 3
System.out.println(animals == copyAnimals); // true

沒有留言:

張貼留言