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