Java中的函数式接口及Lambda表达式

2019-07-21  本文已影响0人  DASH_1024

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;
上一篇下一篇

猜你喜欢

热点阅读