Java Lambda

記錄lambda學習的集錄java

基本結構: [參數]->[參數] | [語句]併發

--------------------------------------------------函數

接口 lambda

注意點: 在實現接口的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

之前的集合操做是順序化的, 使用lambda能夠並行化處理.

說到並行,就會想到併發, 直白的解釋: 並行是多個一塊兒幹,併發是多個穿插幹.

遍歷List

寫個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

 

Predicate接口 Stream filter過濾

以上遍歷了一個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方法

在stream的map()方法中,會操做集合中的每一個元素,看下面代碼:

如今要在List中全部元素前面加"hi,"的字符串拼接

list.stream().map(str->"hi,"+str).forEach(System.out::println);
輸出結果:
hi,jerry
hi,man
hi,tom
hi,superman

 

Stream Reduce方法

此方法並不陌生,功能就像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中的元素

 

Collect

若是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());

 

------------------------------------------------------------

相關文章
相關標籤/搜索