Lambda 表达式简介
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
Lambda
表达式是在 JDK 8 版本中引入的一个新特性,用于取代大部分的匿名内部类。Lambda
表达式的语法非常简洁,可以用更少的代码来实现同样的功能。同时,JDK 中增加了一些函数式接口,用于支持 Lambda
表达式的使用。
例如,下面是一个使用匿名内部类的示例:
在 Java8 版本中函数式编程成为了一个重要的特性,Lambda 表达式是函数式编程的一种实现方式。Lambda 表达式可以将函数作为参数传递给其他函数,从而实现更加灵活的编程方式。
函数式编程是一种编程范式,它将计算机程序视为数学函数的计算。在函数式编程中,函数是一等公民,可以作为参数传递给其他函数,也可以作为返回值返回。Lambda 表达式是函数式编程的一种实现方式,它可以将函数作为参数传递给其他函数,从而实现更加灵活的编程方式。
函数式接口是只包含一个抽象方法,但是可以有多个非抽象方法(默认方法、静态方法或者 Object 类中的方法)的接口。函数式接口可以被隐式转换为 Lambda 表达式。只要确保接口类中只有一个抽象方法,Lambda 表达式就可以被赋值给该接口。
在创建函数式接口时,可以使用 @FunctionalInterface
注解来标识该接口是一个函数式接口。如果接口不符合函数式接口的定义,编译器会报错。这个注解是可选的,但是推荐使用,即使不使用这个注解,只要接口符合函数式接口的定义,也可以被当作函数式接口使用。
@FunctionalInterface
标记在接口上,指仅仅包含一个抽象方法的接口。
该注解只能标记在“有且仅有一个抽象方法”的接口上。
JDK8 接口中的静态方法和默认方法,都不算抽象方法。
接口默认继承 java.lang.Object
,所以接口显示声明覆盖了 Object
中的方法,那么也不算抽象方法。
该注解不是必须的,如果一个接口符合“函数式接口”定义,那么加不加该注解没有影响,加上该注解能更好的让编译器进行检查。
函数式接口和 Lambda
表达式的关系
函数式接口是 Lambda
表达式的目标类型,Lambda
表达式可以赋值给函数式接口。
函数式接口只包含一个抽象方法,Lambda
表达式可以实现该抽象方法。
函数式接口可以有多个非抽象方法,Lambda
表达式可以调用这些非抽象方法。
使用 Lambda 表达式来表示一个接口的实现(Java8 之前一般都是使用匿名类实现):
Java 8 中增加了一些函数式接口,用于支持 Lambda
表达式的使用。这些函数式接口定义在 java.util.function
包中,如下表所示:
BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果。
BiFunction<T,U,R>
代表了一个接受两个输入参数的方法,并且返回一个结果。
BinaryOperator
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果。
BiPredicate<T,U>
代表了一个两个参数的 boolean 值方法。
BooleanSupplier
代表了 boolean 值结果的提供方。
Consumer
代表了接受一个输入参数并且无返回的操作。
DoubleBinaryOperator
代表了作用于两个 double 值操作符的操作,并且返回了一个 double 值的结果。
DoubleConsumer
代表一个接受 double 值参数的操作,并且不返回结果。
DoubleFunction
代表接受一个 double 值参数的方法,并且返回结果。
DoublePredicate
代表一个拥有 double 值参数的 boolean 值方法。
DoubleSupplier
代表一个 double 值结构的提供方。
DoubleToIntFunction
接受一个 double 类型输入,返回一个 int 类型结果。
DoubleToLongFunction
接受一个 double 类型输入,返回一个 long 类型结果。
DoubleUnaryOperator
接受一个参数同为类型 double,返回值类型也为 double。
Function<T,R>
接受一个输入参数,返回一个结果。
IntBinaryOperator
接受两个参数同为类型 int,返回值类型也为 int。
IntConsumer
接受一个 int 类型的输入参数,无返回值。
IntFunction
接受一个 int 类型输入参数,返回一个结果。
IntPredicate
接受一个 int 输入参数,返回一个布尔值的结果。
IntSupplier
无参数,返回一个 int 类型结果。
IntToDoubleFunction
接受一个 int 类型输入,返回一个 double 类型结果。
IntToLongFunction
接受一个 int 类型输入,返回一个 long 类型结果。
IntUnaryOperator
接受一个参数同为类型 int,返回值类型也为 int。
LongBinaryOperator
接受两个参数同为类型 long,返回值类型也为 long。
LongConsumer
接受一个 long 类型的输入参数,无返回值。
LongFunction
接受一个 long 类型输入参数,返回一个结果。
LongPredicate
R 接受一个 long 输入参数,返回一个布尔值类型结果。
LongSupplier
无参数,返回一个结果 long 类型的值。
LongToDoubleFunction
接受一个 long 类型输入,返回一个 double 类型结果。
LongToIntFunction
接受一个 long 类型输入,返回一个 int 类型结果。
LongUnaryOperator
接受一个参数同为类型 long,返回值类型也为 long。
ObjDoubleConsumer
接受一个 object 类型和一个 double 类型的输入参数,无返回值。
ObjIntConsumer
接受一个 object 类型和一个 int 类型的输入参数,无返回值。
ObjLongConsumer
接受一个 object 类型和一个 long 类型的输入参数,无返回值。
Predicate
接受一个输入参数,返回一个布尔值结果。
Supplier
无参数,返回一个结果。
ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个 double 类型结果
ToDoubleFunction
接受一个输入参数,返回一个 double 类型结果。
ToIntBiFunction<T,U>
接受两个输入参数,返回一个 int 类型结果。
ToIntFunction
接受一个输入参数,返回一个 int 类型结果。
ToLongBiFunction<T,U>
接受两个输入参数,返回一个 long 类型结果。
ToLongFunction
接受一个输入参数,返回一个 long 类型结果。
UnaryOperator
接受一个参数为类型 T,返回值类型也为 T。