Lambda表达式是Java语言环境中提供一种优雅的方式来支持函数式编程
Lambda表达式组成:参数列表——>函数体
Consumer<Integer> myConsumer = (y) -> {System.out.println("y = " + y);};
Lambda表达式实际上返回的是Functional接口
Functional接口定义规范是接口中只有一个普通方法。
同时Java8增加了一种特殊的注解@FunctionalInterface来标识这个接口是一个Functional接口,当接口有此注解时并且接口中不只有一个普通方法时,会发生编译报错。 默认方法与静态方法并不影响 Functional 接口的契约,可以任意使用
常用的Functional接口:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
@FunctionalInterface
public interface Supplier<T> {
T get();
}
上述四个接口都在java.util.function包下,此包下还有这四个接口的衍生接口(不是继承啊),感兴趣的可以自己去看看,除了这个包下还有其他比较常用的接口,像Runnable和Callable<V>接口
Lambda表达式语法
Lambda由以下几部分组成
- 用括号括起来以逗号分隔的形式参数列表
可以忽略参数的数据类型。如果只有一个参数,可以省略括号
x->System.out.println("Hello World!!!")
- 箭头 ->
- 由单个表达式或语句块组成的主体
如果表达式有返回值并且主体只有一个表达式,会直接返回表达式的值。您也可以使用return语句,但是必须将代码用{}包裹起来
x->{return x>0?true:false;}
Lambda访问局部变量和成员变量
Lamdba可以引用类的成员变量与局部变量 ,局部变量类型会被隐含转为final,如果你对在Lambda表达式中的局部变量进行修改,程序编译会报错
import java.util.function.Consumer;
public class LambdaScopeTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
// The following statement causes the compiler to generate
// the error "local variables referenced from a lambda expression
// must be final or effectively final" in statement A:
//
// x = 99;
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x); // Statement A
System.out.println("y = " + y);
System.out.println("this.x = " + this.x);
System.out.println("LambdaScopeTest.this.x = " +
LambdaScopeTest.this.x);
};
myConsumer.accept(x);
}
}
public static void main(String... args) {
LambdaScopeTest st = new LambdaScopeTest();
LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
输出结果
x = 23
y = 23
this.x = 1
LambdaScopeTest.this.x = 0
更多详情可以参考官方文档