Java8 新特性之Lambda表达式以及函数式接口
1.Lambda表达式的意义与构建规则
Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。
简单的结构:
(参数1->表达式1)
((参数1,参数2,..)->{表达式1;表达式2 ;..})
显示指定参数类型:
((String 参数1,String 参数2,..)->{表达式1;表达式2 ;..})
可以看到:如果是多个参数则必须用(),多行表达式要用{},并且用;隔开
最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:
Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) );
首先Arrays.asList( “a”, “b”, “d” )是将数组转为list因为数组不是object类型的不能直接.(点)出来方法,通过list来调用forEach方法,一个参数e,一行代码块System.out.println( e ),则省略了很多东西,完整的写法应该是:
Arrays.asList( “a”, “b”, “d” ).forEach((String e)->{System.out.println(e);});
2.函数式接口
Runnable接口就是标准的函数式接口,那么具体的定义:
函数式接口就是只定义一个自己的抽象方法的接口.隐藏的规则:
- 所有的接口都继承了object的方法,所以继承了object的方法不是自己的抽象方法
- 默认方法与静态方法不是抽象方法
- 可以用@FunctionalInterface进行标明该接口是函数式接口,也可以不标注,但是表中之后可以自动检测该接口是否符合函数式接口的定义,类似于泛型的使用,编译的时候就可以检测出来.
例如:
@FunctionalInterface
public interface ILambda
int add(Integer o1, Integer o2);
boolean equals(Object obj);
int hashCode();
}
就是一个函数式接口.
3.Lambda表达式的使用
通过配合函数式接口我们可以更清晰的明白如何使用lambda表达式
使用上述的函数式接口,我们可以这样使用:
public class Test {
public static void main(String[] args) {
ILambda
Integer cInteger= lambda.add(1, 2);
System.out.println(cInteger);
}
}
可以看到,lambda表达式就是add方法的实现,准确的说箭头后面的代码块才是真正的add方法的实现,
这个代码块是我们根据业务需求临时定义的,极大的提高了代码的灵活性,我们完全可以根据需求的变动而实现不同的代码块,而不需要修改其他的代码;
具体的逻辑:
根据函数式接口的定义,只有一个抽象方法,那么我们就可以知道,lambda表达式就是这个抽象方法的实现(或者说是实例),这就是行为参数化.
注意:
这个lambda表达式必须是符合抽象方法定义的,也就是所上述的两个参数必须是Integer类型的,不能显示的定义为其他类型,当然后面的代码块中两个参数的行为也必须是符合Integer类型的.另外,如果代码块只有一行,则可以省略返回值,如果多行需要显示的return返回值,返回值类型也要符合抽象方法的声明.
欢迎参看原文//www.poppyflower.cn/?p=127
还没有评论,来说两句吧...