Java 函数式编程 - 函数式接口 函数式接口在 Java 中是指:有且仅有一个抽象方法的接口。 函数式接口可以被隐式转换为 Lambda 表达式。
Java 函数式编程 - 函数式接口
概念
函数式接口在 Java 中是指:有且仅有一个抽象方法的接口
函数式接口可以被隐式转换为 Lambda 表达式。
@FunctionalInterface
@FunctionalInterface // 标明为函数式接口
public interface MyFunctionInterface {
void mrthod(); //抽象方法
}
一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。(该接口是一个标记接口)
常用的函数式接口
Supplier 接口
@FunctionalInterface
public interface Supplier<T> {
T get();
}
用来返回一个值,即供应器
Consumer 接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
用来消费一个值,即消费器
默认方法
-
andThen
:组合多个 consumer,可以实现消费数据的时候,首先做一个操作,然后再做一个操作
Consumer<Integer> consumer = ((Consumer<Integer>) i -> System.out.println("a" + i))
.andThen(i -> System.out.println("b" + i));
Stream.of(1, 2, 3, 4).forEach(consumer);
// 输出:a1 b1 a2 b2 a3 b3 a4 b4
Predicate 接口
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
用来判断一个值是否符合条件,即判断器
默认方法
-
negate
:取反 -
and
:类似于&&
-
or
:类似于||
静态方法
-
isEqual
:返回一个输入值是否等于目标值的 Predicate 接口
Function 接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
用来将一个值转换成其它类型的值,即转换器
默认方法
-
andThen
:组合多个 function,可以实现先做一个转换,再做一个转换
Function<Integer, Integer> mapper = ((Function<Integer, Integer>) i -> i * 10)
.andThen(i -> i - 1);
Stream.of(1, 2, 3, 4)
.map(mapper)
.forEach(System.out::println);
// 输出:9 19 29 39
-
compose
:也是组合多个 function,不过组合顺序跟andThen
相反
Function<Integer, Integer> mapper = ((Function<Integer, Integer>) i -> i * 10)
.compose(i -> i - 1);
Stream.of(1, 2, 3, 4)
.map(mapper)
.forEach(System.out::println);
// 输出:0 10 20 30
静态方法
identity
:不做转换,原样返回输入值
UnaryOperator 接口
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
[[#Function 接口]]的特例,转换前和转换后的类型不变
BiFunction 接口
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
}
[[#Function 接口]]的另一个版本,接收两个值并返回一个新值
BinaryOperator 接口
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
[[#BiFunction 接口]]的特例,转换前和转换后的类型不变
Java8 新增的函数式接口
Supplier
接口 | 描述 |
| 无参数,返回一个结果 |
| 代表了 boolean 值结果的提供方 |
| 无参数,返回一个 int 类型结果 |
| 无参数,返回一个结果 long 类型的值 |
| 代表一个 double 值结构的提供方 |
Consumer
接口 | 描述 |
| 代表了接受一个输入参数并且无返回的操作 |
| 接受一个 int 类型的输入参数,无返回值 |
| 接受一个 long 类型的输入参数,无返回值 |
| 代表一个接受 double 值参数的操作,并且不返回结果 |
| 接受一个 object 类型和一个 int 类型的输入参数,无返回值 |
| 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
| 接受一个 object 类型和一个 long 类型的输入参数,无返回值 |
| 接受一个 object 类型和一个 double 类型的输入参数,无返回值 |
Predicate
接口 | 描述 |
| 接受一个输入参数,返回一个布尔值结果 |
| 接受一个 int 输入参数,返回一个布尔值的结果 |
| 接受一个 long 输入参数,返回一个布尔值类型结果 |
| 代表一个拥有 double 值参数的 boolean 值方法 |
| 代表了一个两个参数的 boolean 值方法 |
Function
接口 | 描述 |
| 接受一个输入参数,返回一个结果 |
| 接受一个 int 类型输入参数,返回一个结果 |
| 接受一个 int 类型输入,返回一个 long 类型结果 |
| 接受一个 int 类型输入,返回一个 double 类型结果 |
| 接受一个 long 类型输入参数,返回一个结果 |
| 接受一个 long 类型输入,返回一个 int 类型结果 |
| 接受一个 long 类型输入,返回一个 double 类型结果 |
| 代表接受一个 double 值参数的方法,并且返回结果 |
| 接受一个 double 类型输入,返回一个 int 类型结果 |
| 接受一个 double 类型输入,返回一个 long 类型结果 |
| 接受一个输入参数,返回一个 int 类型结果 |
| 接受一个输入参数,返回一个 long 类型结果 |
| 接受一个输入参数,返回一个 double 类型结果 |
UnaryOperator
接口 | 描述 |
| 接受一个参数为类型 T,返回值类型也为 T |
| 接受一个参数同为类型 int,返回值类型也为 int |
| 接受一个参数同为类型 long,返回值类型也为 long |
| 接受一个参数同为类型 double,返回值类型也为 double |
BiFunction
接口 | 描述 |
| 代表了一个接受两个输入参数的方法,并且返回一个结果 |
| 接受两个输入参数,返回一个 int 类型结果 |
| 接受两个输入参数,返回一个 long 类型结果 |
| 接受两个输入参数,返回一个 double 类型结果 |
BinaryOperator
接口 | 描述 |
| 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 |
| 接受两个参数同为类型 int,返回值类型也为 int |
| 接受两个参数同为类型 long,返回值类型也为 long |
| 代表了作用于两个 double 值操作符的操作,并且返回了一个 double 值的结果 |