java8笔记:Lambda表达式二
语法:
例:(Apple a1, Apple a2) -> a1.getWeight()>a2.getWeight()
参数 箭头 主体
1、( ) -> {} //参数为空的void方法,如:public void run(){}
2、( ) -> “Hello” 或 ( ) -> {return “Hello World!”;} //参数为空,返回String。如:public String Hello(){return “Hello World!”;}
3、(String s) -> {“This is ” + s;} //错误 要修改成正确的应该在大括号中添加一个return
4、(String s) -> “This is ” + s //正确
函数式接口:
只定义一个抽象方法的接口,可使用注解@FunctionalInterface帮助我们检测是否满足函数式接口要求
例如:public interface Runnable{ void run( ); }
public interface Callable<V>{ V call( ); }
如之前例子里面定义的接口
public interface ApplePredicate{ boolean test(Apple apple)}
作用:Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。(具体说来就是:函数式接口的一个具体实现的实例)
用匿名内部类也可以完成同样的事情,只不过比较笨拙。
看个例子:
类型推断:
java编译器会从上下文(目标类型)推断出用什么函数式接口来配合Lambda表达式。如 List<Apple> greenApple =
filter(appleList, apple -> “green”.equals(apple.getColor()))
局部变量的使用:
同匿名类一样,Lambda表达式是允许使用自由变量的,那么这个变量就得显示的声明为final或者事实上就是final的类型。但是这里还是强调大家谨慎使用
可以认为Lambda是对值封闭,而不是对变量封闭。这种限制存在的原因在于局部变量保存在栈上,也就是它们仅限于其所在的线程使用。如果允许改变局部变量,就会引发造成线程不安全的问题。
局部变量的使用例子:
这里可以看到我们赋值了两次的变量,在便用的时候就会报错,提示我们,但是如果你包了一层,放在集合里面,我们不改动集合,但是可以改动集合里面的内容。所以这里使用的时候得注意!!!
方法引用:方法引用可以重复使用现有的方法定义,并像lambda一样传递;它就是让你根据已有的方法实现来创建lambda表达式。
使用方式: 目标应用放在分隔符“ :: ”前,方法名称放后面。如Apple::getWeight,
原文地址: https://zhuanlan.zhihu.com/p/32736715
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章