記錄lambda學習的集錄java
基本結構: [參數]->[參數] | [語句]併發
--------------------------------------------------函數
注意點: 在實現接口的lambda時,只容許單方法接口,排除繼承Object提供的方法.學習
例以下方接口,只存在一個方法: spa
interface Fun{ String fun_1(String msg); }
使用lambda,以下:翻譯
Fun fun=msg -> msg + " World" ; fun.fun_1("Hello"); //調用結果: Hello World
↑ 若是參數只有一個的時候,()此括號可省略;3d
↑ 參數的類型能夠省略, lambda本身知道.code
↑ 若是->後面函數體只有一句,{}此括號可省略,若是有接口中方法有返回值(如上方的返回值是String)則自動return那句結果;對象
↑ 若是後面加上{}括號,須要在{}中完成一條語句的寫法,就是 return xxx; 由分號結束.繼承
所有補上寫成: (String msg)->{ return msg+" World";}; 不用在這些上糾結,知道基本結構,後面用着用着就理解了.
如下是錯誤的接口,是不能用lambda的(只容許有一個方法,):
interface Fun{ String fun_1(String msg); String fun_2(String msg); }
如下接口,是可行的(Object提供的方法equals):
interface Fun{ String fun_1(String msg); boolean equals(Object obj); }
之前的集合操做是順序化的, 使用lambda能夠並行化處理.
說到並行,就會想到併發, 直白的解釋: 並行是多個一塊兒幹,併發是多個穿插幹.
寫個Demo,熟悉熟悉 ,先加一個list集合,加了4個值,下面的操做都是這個list:
List<String> list = new ArrayList(); list.add("jerry"); list.add("man"); list.add("tom"); list.add("superman");
遍歷 list:
list.forEach(n -> System.out.println(n)); 或者 list.forEach(System.out::println);//::雙冒號操做符,引用println方法的功能 結果是按順序輸出: jerry man tom superman
以上遍歷了一個List,如今關於對List集合中的元素的操做作個記錄,predicate接口能夠過濾集合數據.
相似SQL語句中where後面的條件篩選功能.
能夠打開Predicate看一下,裏面須要用到的如下一個抽象方法
boolean test(T t);
還有一些其餘的default的方法(返回的是自己,就能夠鏈式調用)和一個isEqual方法(這個方法用到了::和lambda能夠看看幫助理解),都不須要實現.
過濾操做List,如下代碼,用到java.util.stream接口: ↓↓↓
Predicate<String> predicate = n -> n.length() > 3; //元素的長度大於3 Predicate<String> predicate1 = n -> n.indexOf("man") > -1; //元素中要存在man字符串 //下面filter過濾predicate和predicate1的條件,再forEach輸出結果 list.stream().filter(predicate.and(predicate1)).forEach(System.out::println); 結果輸出: superman
在stream的map()方法中,會操做集合中的每一個元素,看下面代碼:
如今要在List中全部元素前面加"hi,"的字符串拼接
list.stream().map(str->"hi,"+str).forEach(System.out::println); 輸出結果: hi,jerry hi,man hi,tom hi,superman
此方法並不陌生,功能就像SQL中的SUM(),AVG()等彙集函數
點進Stream接口中能夠看到reduce抽象方法的說明,gooale翻譯一下,參考理解
//引用上面的map()後面的結果,用reduce將元素以|分隔都拼接起來 String conStr=list.stream().map(str->"hi,"+str).reduce((s1, s2) -> s1+" | "+s2).get(); //結果輸出: hi,jerry | hi,man | hi,tom | hi,superman //直接拼接的話,可使用如下方式 String conStr=list.stream().map(str->"hi,"+str).reduce(String::concat).get(); //結果輸出: hi,jerryhi,manhi,tomhi,superman //後面講到collect()也能夠拼接list中的元素
若是filter操做完了,使用collect(Collectors.*),生成一個新的List結果集
List<String> stringList=list.stream().filter(n->n.length()>3).collect(Collectors.toList()); stringList.forEach(System.out::println); //結果輸出: jerry superman //Collectors中有不少好使的方法,能夠點點看看 String conStr1=list.stream().map(str->"hi,"+str).collect(Collectors.joining(" | ")); //結果輸出: hi,jerry | hi,man | hi,tom | hi,superman //獲取infoList集合中Users對象的id,生成一個Integer類型的list集合 List<Integer> integerList=infoList.stream().map(Users::getId).collect(Collectors.toList());
------------------------------------------------------------