Java Lambda表达式
2016-05-04 本文已影响376人
Sivin
标签(空格分隔):java
Lambda
表达式是java8的重要更新,Lambda表达式的目标类型必须是函数式接口
什么样的接口符合函数式接口呢?
通俗直观的可这样认为:一个接口中只含有一个抽象方法。
注:函数式接口可以包含多个默认方法,类方法,但只能声明一个抽象方法。
如何使用呢?
两个条件:
1.Lambda表达式的目标类型必须是明确的函数式接口
2.lambda表达式只能为函数式接口创建对象。(只能为只有一个抽象方法的接口创建对象)
Lambda表达式时为了让我们只关注方法的形参
和方法体
,不用关注方法名和接口或类名,当然如果这个方法的返回值为void
的话,也不用关注返回值,对于有返回值的函数式接口
,如果方法体一条语句就返回,同时也可以不用带方法体,直接在->
后面跟上表达式结果就会默认认为是返回值;
//常规写法:
iter.forEachRemaining(new Consumer<Student>() {
@Override
public void accept(Student t) {
System.out.println(t.getName());
}
});
//Lambda式写法:
iter.forEachRemaining((Student studnet)->{
System.out.println(studnet.getName()));
}
//当只有一个类型的形参或者一个语句时,我们可以省略形参类型和方法体
//如:
iter.forEachRemaining(t->System.out.println(t.getName()+"第一个"));
什么,一个例子不够?,那再来一个:
//常规写法:
pr.precess(target,new Command(){
public int process(int[] temp){
int sum =0;
for(int t:temp){
sum +=t;
}
return sum;
}
});
//Lambda式写法:
pr.process(tar,(int[] temp)->{
int sum =0;
for(int t:temp){
sum +=t;
}
return sum;
});
如果方法体中的表达式只有一个,而且表达式的值就是返回值,甚至可以省略return
语句
pr.test((a,b)->a+b);
是不是十分简洁呢?
下面说一下注意事项:
为了保证Lambda
表达式的目标类型是一个明确的函数式接口,可以有下面三种常见方式:
1.将Lambda赋值给函数式接口类型的变量;
2.将Lambda表达式作为函数式类型接口的某个方法传递给某个方法。
3.使用函数式接口对Lambda式进行强制类型转换。
Object obj = (Runnable)()->{
for(int i =0 ; i< 100 ; i++){
System.out.println(i);
}
}
当然简洁的同时,也是一把双刃剑,同时也增加了代码理解的复杂度,使用还需根据需要。