概述
lambda 表达式, 是 Java8 中的一个新特性. 可以理解为一个匿名函数.
lambda 表达式可以理解为将一个函数浓缩为一行代码, 使代码更加简洁紧凑.
lambda 表达式语法:
(parameters) -> statement;
或
(parameters) -> {statements;}
参数如下:
parameters: 参数, 可以指定或不指定参数类型, 当只有一个参数时可以不要圆括号
statement: 函数返回值, 直接返回该值, 无需大括号
statements: 函数体, 当使用大括号时需要指明表达式返回的值
lambda 表达式实例:
- // 无参, 返回 5
- () -> 5;
- // 接收参数 x, 返回 2*x
- x -> 2 * x;
- // 接收参数 x y, 返回 x+y
- (x, y) -> x + y;
- // 指明接收参数类型
- (int x, int y) -> x + y;
- // 接收字符串并打印, 无返回值
- (String s) -> System.out.print(s);
- // 包括函数体
- (String s) -> {
- System.out.print(s);
- return s;
- };
Java 中使用 lambda 表达式
在 Python 中是有的. 但是 Python 中万物皆对象, 直接将函数赋值给一个变量即可, 那么在 Java 中该如何使用 lambda 表达式呢?
运行结果
可以看出 lambda 表达式实质是实现了接口中的方法, 怎么感觉向匿名内部类呢?
lambda 表达式与匿名内部类的区别:
this 关键字. 匿名内部类中的 this 指当前匿名类, lambda 表达式中的 this 指 lambda 的外部类.
FunctionInterface 注解:
@ FunctionInterface 是 Java8 中新加入的接口, 用于指明该接口是根据 Java 语言规范定义的函数式接口. 例如如下代码:
- @FunctionInterface
- public interface MathOperation{
- public int operation(int a, int b);
- }
若在接口中加入更多的抽象方法, 将抛出编译错误.
lambda 表达式中的变量
这样看没什么毛病, 但是要想在后面修改该字符串, 问题就来了
可以看到, lambda 表达式使用的外部的局部变量必须是 final 的, 那么成员变量呢?
成员变量以及静态变量可以使用, 并在之后进行修改, 至于原因可以看我的这篇文章
Java 内部类
Java 中 lambda 表达式举例
那么 Java 中引入 lambda 表达式可以带来怎样的便利呢? 通过下面几个例子可以看一看:
1. 创建线程
2. 遍历 list
当然还有很多, 可以自己尝试
Java8 函数式接口
函数式接口就是一个有且仅有一个抽象方法, 但可以有多个非抽象方法的接口.
函数式接口很好的支持了 lambda 表达式.
JDK1.8 之前以有的函数式接口:
- java.lang.Runable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK1.8 新增的函数式接口:
java.util.function 包下包含了很多类, 用来支持 Java 的函数式编程, 该包下的函数式接口有:
BiConsumer<T,U>: 代表了一个接受两个输入参数的操作, 并且不返回任何结果
BiFunction<T,U,R>: 代表了一个接受两个输入参数的方法, 并且返回一个结果
BinaryOperator<T>: 代表了一个作用于于两个同类型操作符的操作, 并且返回了操作符同类型的结果
BiPredicate<T,U>: 代表了一个两个参数的 boolean 值方法
BooleanSupplier: 代表了 boolean 值结果的提供方
Consumer<T>: 代表了接受一个输入参数并且无返回的操作
DoubleBinaryOperator: 代表了作用于两个 double 值操作符的操作, 并且返回了一个 double 值的结果.
DoubleConsumer: 代表一个接受 double 值参数的操作, 并且不返回结果.
DoubleFunction<R>: 代表接受一个 double 值参数的方法, 并且返回结果
DoublePredicate: 代表一个拥有 double 值参数的 boolean 值方法
DoubleSupplier: 代表一个 double 值结构的提供方
DoubleToIntFunction: 接受一个 double 类型输入, 返回一个 int 类型结果.
DoubleToLongFunction: 接受一个 double 类型输入, 返回一个 long 类型结果
DoubleUnaryOperator: 接受一个参数同为类型 double, 返回值类型也为 double .
Function<T,R>: 接受一个输入参数, 返回一个结果.
IntBinaryOperator: 接受两个参数同为类型 int, 返回值类型也为 int .
IntConsumer: 接受一个 int 类型的输入参数, 无返回值 .
IntFunction<R>: 接受一个 int 类型输入参数, 返回一个结果 .
IntPredicate: 接受一个 int 输入参数, 返回一个布尔值的结果.
IntSupplier: 无参数, 返回一个 int 类型结果.
IntToDoubleFunction: 接受一个 int 类型输入, 返回一个 double 类型结果 .
IntToLongFunction: 接受一个 int 类型输入, 返回一个 long 类型结果.
IntUnaryOperator: 接受一个参数同为类型 int, 返回值类型也为 int .
LongBinaryOperator: 接受两个参数同为类型 long, 返回值类型也为 long.
LongConsumer: 接受一个 long 类型的输入参数, 无返回值.
LongFunction<R>: 接受一个 long 类型输入参数, 返回一个结果.
LongPredicate: R 接受一个 long 输入参数, 返回一个布尔值类型结果.
LongSupplier: 无参数, 返回一个结果 long 类型的值.
LongToDoubleFunction: 接受一个 long 类型输入, 返回一个 double 类型结果.
LongToIntFunction: 接受一个 long 类型输入, 返回一个 int 类型结果.
LongUnaryOperator: 接受一个参数同为类型 long, 返回值类型也为 long.
ObjDoubleConsumer<T>: 接受一个 object 类型和一个 double 类型的输入参数, 无返回值.
ObjIntConsumer<T>: 接受一个 object 类型和一个 int 类型的输入参数, 无返回值.
ObjLongConsumer<T>: 接受一个 object 类型和一个 long 类型的输入参数, 无返回值.
Predicate<T>: 接受一个输入参数, 返回一个布尔值结果.
Supplier<T>: 无参数, 返回一个结果.
ToDoubleBiFunction<T,U>: 接受两个输入参数, 返回一个 double 类型结果
ToDoubleFunction<T>: 接受一个输入参数, 返回一个 double 类型结果
ToIntBiFunction<T,U>: 接受两个输入参数, 返回一个 int 类型结果.
ToIntFunction<T>: 接受一个输入参数, 返回一个 int 类型结果.
ToLongBiFunction<T,U>: 接受两个输入参数, 返回一个 long 类型结果.
ToLongFunction<T>: 接受一个输入参数, 返回一个 long 类型结果.
UnaryOperator<T>: 接受一个参数为类型 T, 返回值类型也为 T.
来源: https://www.cnblogs.com/hujingnb/p/10181624.html