C++,C#,Python等各个编程语言早已经支持lambda表达式了,Java从java8开始也支持Lambda表达式了,其中在java.util.function 包中提供给我们一些最常用的函数式接口。
四个最基本的函数式接口
Function<T, R>:R apply(T t) 输入类型T返回类型R。
Consumer<T>:void accept(T t) 输入类型T,“消费”掉,无返回。
Predicate<T>:boolean test(T t) 输入类型T,并进行条件“判断”,返回true|false。
Supplier<T>:T get() 无输入,“生产”一个T类型的返回值。
基本数据类型的函数式接口
上面的四个接口因为使用泛型,Java泛型不支持基本数据类型,又因为基本数据类型与引用类型频繁的拆装箱将会严重影响效率,所以有Java还提供了几个基本数据类型的函数式接口:
double类型的函数式接口
DoubleFunction<R>:R apply(double value);
DoubleConsumer:void accept(double value);
DoublePredicate:boolean test(double value);
DoubleSupplier:double getAsDouble();
int类型的函数式接口
IntFunction<R>:R apply(int value);
IntConsumer:void accept(int value);
IntPredicate:boolean test(int value);
IntSupplier:int getAsInt();
long类型的函数式接口
LongFunction<R>:R apply(long value);
LongConsumer:void accept(long value);
LongPredicate:boolean test(long value);
LongSupplier:long getAsLong();
boolean类型的函数式接口
BooleanSupplier:boolean getAsBoolean();
二元函数式接口
BiFunction<T, U, R>:R apply(T t, U u);
BiConsumer<T, U>:void accept(T t, U u);
BiPredicate<T, U>:boolean test(T t, U u);
Lambda表达式语法
(int x, int y) -> { return x + y; }
其中(int x, int y)为参数列表, {return x + y}为函数体,中建用箭头“->”连接起来。下面列举一些示例:
// 多个参数
(type1 arg1, type2 arg2...) -> { body }
(int a, int b) -> { return a + b; }
// 可以显式声明参数的类型,也可以从上下文推断参数的类型。
(arg1, arg2...) -> { body }
(a, b) -> { return a + b; }
// 一个参数
(a) -> { return a * a; }
// 参数列表只有一个参数可以省略:参数列表的小括号
a -> { return a * a; }
// 方法体只有一条语句可以省略:方法体大括号以及return关键字
a -> a * a;
// 没有参数,需要用一对空括号来表示
() -> return 1;