Java8新特性

準備

先看2個例子java

1.篩選集合中年齡大於20的用戶的用戶名列表,並輸出

1         // 初始化集合
2         List<User> users = Arrays.asList(
3                 new User("週一", 20),
4                 new User("吳二", 25),
5                 new User("鄭三", 30),
6                 new User("王四", 35)
7         );    

普通方式ide

1 List<String> userNames = new ArrayList<>();
2         for (User user : users) {
3             if (user.getAge().intValue() > 20) {
4                 userNames.add(user.getName());
5             }
6         }
7         for (String userName : userNames) {
8             System.out.println(userName);
9         }

java8方式函數

1 users.stream()
2                 .filter(user -> user.getAge().intValue() > 20)
3                 .map(User::getName)
4                 .forEach(System.out::println);

 

2.Integer集合排序

1         // 初始化集合
2         List<Integer> integers = Arrays.asList(5, 4, 3, 2, 1);    

普通方式工具

1 integers.sort(new Comparator<Integer>() {
2             @Override
3             public int compare(Integer o1, Integer o2) {
4                 return Integer.compare(o1, o2);
5             }
6         });
7         System.out.println(integers);

java8方式大數據

1 integers.sort((x, y) -> Integer.compare(x, y));
2 System.out.println(integers);

更精簡一點spa

1 integers.sort(Integer::compare);
2 System.out.println(integers);

 

Lambda表達式

匿名內部類的方式,會有大量的樣板代碼(固定代碼),如code

並且對這個例子而言,咱們真正的意圖是要傳遞一個如何進行排序的操做,而這裏傳遞的是一個對象,沒法清晰的描述咱們的意圖。對象

Lambda表達式一方面化簡了樣板代碼,另外一方面是傳遞方法、操做、行爲。blog

Lambda表達式結構分爲兩部分,以->分隔,->左邊的是參數,->右邊的是表達式內容,以下:排序

user -> user.getAge().intValue() > 20

參數     執行的操做

 

類型推斷

List<String> userNames = new ArrayList<>(); // new時未指定泛型

javac能夠根據上下文推斷泛型類型,如上面的代碼中,定義的list的泛型是String,則在new時無需再指定。

Lembda表達式中也能夠作類型推斷,以下面的代碼,無需指定參數x, y的類型,由於integers集合的泛型是Integer類型,javac能夠根據上下文推斷出來。

  integers.sort((x, y) -> Integer.compare(x, y));

 

函數式接口

使用Lembda表達式,實際上是java幫助咱們實現了接口(若是sort中的Comparator接口),可是接口裏面有兩個抽象方法會怎樣?

使用Lembda表達式對接口的要求是,接口中只能有一個抽象方法,這種接口被稱爲函數式接口。java8中提供了@FunctionInterface註解,用於標識和約束函數式接口。

 

默認方法

接口中能夠添加默認方法,即非抽象方法,能夠被繼承、重寫。

 

靜態方法

接口中能夠添加靜態方法,和普通類中的靜態方法同樣

 

Stream-Api

 Stream是用函數式變成的方式在集合類上進行復雜操做的工具。

映射

map,從原有數據映射成新的數據,數據類型能夠不一致,下面的代碼是從user映射成username

 

過濾

過濾符合條件的數據,定義的Lambda表達式需返回boolean值

 

收集

轉成另外一個集合,如list,set,map等

 

歸約

化簡/合併數據,如計算Integer集合的累加值,identity參數爲累加起始值

 

方法引用

以下面的代碼,javac能夠推斷出map的參數是User類型,則表達式能夠化簡爲User::getName,注意沒有(),由於不是去調用getName方法而是傳遞這個操做。

 

Parallel

並行化是把工做進行拆分在多核cpu上執行的方式。

經過 integers.parallelStream() 或者 integers.stream().parallel() 能夠建立並行stream,充分利用cpu資源,底層基於forkjoin模式。

因此須要注意,forkjoin中會有工做拆分和結果彙總操做,這部分操做會佔用一部分時間,因此這種方式只適合處理大數據。

相關文章
相關標籤/搜索