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

 

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

相关文章
相关标签/搜索