1.用lambda实现Runnable
new Thread( () -> sout("Lambda expression rocks!!") ).start();
等同于:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Java8之前的写法");
}
}).start();
2.对列表进行迭代
list.forEach( n -> System.out.println(n); );
//--如果输出和参数相同,则可以省略参数
list.forEach( System.out:println; );
等同于:
for(n : list){
System.out.println(n);
}
3.函数式接口Predicate
可以向API添加逻辑,用更少的代码支持更多的动态行为。 public void filter(String name,Predicate condition){
if(condition.test(name)){
sout(name+" ");
}
}
那么在调用时,我们就可以通过predicate来进行判断
4.Map和Reduce
1.map允许你将对象进行转换,将列表中的每个元素转换为修改之后的值。
eg: List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
costBeforeTax.stream().map( (cost)->cost+.12*cost )
.forEach(System.out::println);
2.reduce可以对所有值进行合并,比较类似SQL中的sum()、avg()、count()等
eg:对修改后的数据进行计算,接收多个值,返回一个值
costBeforeTax.stream().map( (cost)->cost+.12*cost ).reduce( (sum,cost)-> sum+cost).get();
5.filter过滤
使用lambda表达式和流API过滤大规模数据集合,流提供了一个filter()方法,接受一个Predicate对象,即可以传入一个lambda表达式作为过滤逻辑eg: List<String> filtered = strList.stream().filter( x-> x.length()>10).collect(Collectors.toList);
得到的结果为:过滤后的strList,长度都是大于10的
6.distinct()去重
numbers.stream().distinct().collect(Collectors.toList);7.集合的最大值、最小值、总和及平均值
IntStream、LongStream和DoubleStream等流的类中,有个方法叫做summaryStatistics(),可以返回IntSummaryStatistics、LongSummaryStatistics或者DoubleSummaryStatisticeg: IntSumnumberList stats = numberList.stream().mapToInt((x)->x).summaryStatistics()
stats存在 getMax、getMin、getSum、getAverage、getCount方法
8.Lambda表达式与匿名类
this关键字:匿名类的this关键字指向匿名类
lambda表达式的this关键字指向包围lambda表达式的类
编译方式:
java编译器将lambda表达式编译成类的私有方法,使用java7的invokedynamic字节码指令来动态绑定这个方法。
9.限制:
1.lambda表达式只能引用final或final局部变量,即在lambda内部不能修改定义在域外的变量。10.避免Null
当出现多层嵌套时,调用其中的方法可能会抛出NullPointException异常,所以我们可以通过Optional类型来预防null检查 eg:new Outer().getNested().getInner().getFoo()中可能会出现Null异常
修改过后:
Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);
注:以上由个人总结得出,如有雷同,那就雷同吧