java8推出了lambda.
Lambda :可以传递匿名函数的一种方式,没有名称,但是有参数列表,函数主体,返回类型,可能还有一个可以抛出异常的异常列表。
基本语法:
(parameters)->expression
或者:
(parameteres)->{statements;}
随便举几个案列:
布尔表达式 (List<String> list)->list.isEmpty()
组合体 (int a,int b)->a*b
比较两个对象 (Apple a , Apple b)->a.getWeight().compareTo(b.getWeight())
*只有在需要使用函数式接口的时候才能使用Lambda
函数式接口:只定义一个抽象方法的接口。(不管有没有默认的方法,但是只要定义一个)
Lambda表达式允许以直接内联的方式为函数式抽象方法提供实现,并把整个表达式作为函数式接口的实例。->函数式接口就是一个具体实现的实例。
*Lambda表达式的签名必须和抽象方法非签名一致。就是void,int这些,必须对应。
*函数式接口可以在上面写一个@FunctionalInterface标注。该标准表示该接口将会设计成函数式接口。
举个例子:
(1) execute(() -> {});
public void execute(Runnable r){
r.run();
}
(2) public Callable<String> fetch() {
return () -> "Tricky example ;-)";
}
(3) Predicate<Apple> p = (Apple a) -> a.getWeight();
这是书上的一个列子,问哪个Lambda表达式是正确的,答案是1和2.因为需要签名一致第一个例子有效,是因为Lambda() -> {}具有签名() -> void,这和Runnable中的 抽象方法run的签名相匹配。请注意,此代码运行后什么都不会做,因为Lambda是空的! 第二个例子也是有效的。事实上,fetch方法的返回类型是Callable<String>。 Callable<String>基本上就定义了一个方法,签名是() -> String,其中T被String代替 了。因为Lambda() -> "Trickyexample;-)"的签名是() -> String,所以在这个上下文 中可以使用Lambda。 第三个例子无效,因为Lambda表达式(Apple a) -> a.getWeight()的签名是(Apple) -> Integer,这和Predicate<Apple>:(Apple) -> boolean中定义的test方法的签名不同。