Lambda表达式带来了函数式编程的思想。面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。
一、Lambda表达式的优点:
1.类库的开发者使用Java时,抽象的级别还不够。处理大数据就是个很好的例子,面对大数据,Java还欠缺高效的并行操作。Java 8允许开发者编写复杂的集合处理算法,只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写并行处理这些大数据的类库,需要在语言层面上修改现有的Java:增加lambda表达式。开发企业级应用时,好的类库和框架极大地降低了开发时间和成本,也扫清了开发易用且高效的类库的障碍。
2.利用Lambda表达式程序员能编写出更容易阅读的代码——这种代码更多地表达了业务逻辑,而不是从机制上如何实现。易读的代码也易于维护、更可靠、更不容易出错。
3.在写回调函数和事件处理器时,程序员不必再纠缠于匿名内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单。能将函数方便地传递也让编写惰性代码变得容易,只有在真正需要的时候,才初始化变量的值。
4.lambda最差的情况性能内部类一样, 好的情况会更好。二、Lambda表达式的缺点:
Lambda表达式是代码变得精简,但是当出错时,出错栈信息太长
三、Lambada的应用场景
1.使用()->{}替代匿名类
<span style="font-size:14px;"> <span style="white-space:pre"> </span>//原来的Android中的方法
btClcik.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG,"normal click.................");
}
});
//使用Lambda表达式后的方法
btClcik.setOnClickListener((view)->{
Log.e(TAG,"use lambada expressions click.................");
});</span>
2.使用内循环替代外循环
Lambda表达式的优点:
外循环:描述怎么干,代码里嵌套2个以上的for循环的都比较难读懂;只能顺序处理List中的元素;
内循环:描述要干什么,而不是怎么干;不一定需要顺序处理List中的元素
<span style="font-size:14px;"> List<String> items = Arrays.asList("lambada1","lambada2","lambada3","lambada4","lambada5");
//java中的方法
for(String item: items){
Log.e(TAG,"normal recycle................."+item);
}
//括号中第一个字母item是所需参数的名字,可以随便写,获取值时也需要和这个变量名对应
items.forEach(item -> Log.e(TAG,"lambada expression ..........."+item));</span>
forEach一直提示需要API24,即运行在7.0上,否则方法运行总是报错Lambda表达式的优点:
java.lang.NoClassDefFoundError: test.lambda.com.MainActivity$$Lambda$1。
除了不在7.0及其之上运行,不知道其它的解决办法是什么
3.函数式编程
就是方法中的参数可以是函数
<span style="font-size:14px;"> List<String> items = Arrays.asList("lambada7", "lambada6", "lambada8", "lambada9", "lambada10");
items.stream().filter((item) -> (item.equalsIgnoreCase("lambada8'")))
.forEach((name) -> {
System.out.println(name + " ");
});</span>
4.用管道的方式处理数据
<span style="font-size:14px;">final BigDecimal totalOfDiscountedPrices = prices.stream()
.filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0)
.map(price -> price.multiply(BigDecimal.valueOf(0.9)))
.reduce(BigDecimal.ZERO,BigDecimal::add);</span>
参考资料:https://wizardforcel.gitbooks.io/java8-tutorials/content/index.html
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html