先看2個例子java
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);
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);
匿名內部類的方式,會有大量的樣板代碼(固定代碼),如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是用函數式變成的方式在集合類上進行復雜操做的工具。
map,從原有數據映射成新的數據,數據類型能夠不一致,下面的代碼是從user映射成username
過濾符合條件的數據,定義的Lambda表達式需返回boolean值
轉成另外一個集合,如list,set,map等
化簡/合併數據,如計算Integer集合的累加值,identity參數爲累加起始值
以下面的代碼,javac能夠推斷出map的參數是User類型,則表達式能夠化簡爲User::getName,注意沒有(),由於不是去調用getName方法而是傳遞這個操做。
並行化是把工做進行拆分在多核cpu上執行的方式。
經過 integers.parallelStream() 或者 integers.stream().parallel() 能夠建立並行stream,充分利用cpu資源,底層基於forkjoin模式。
因此須要注意,forkjoin中會有工做拆分和結果彙總操做,這部分操做會佔用一部分時間,因此這種方式只適合處理大數據。