1.什么是函数式接口?
- 只包含一个抽象方法的接口,称为函数式接口
- 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
- 我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口
2.四大函数式接口的使用
函数接口如果使用的好能让我们的代码变得较为简洁,且减少重复代码。
2.1. Consumer<T> 消费型接口,有入参,无返回值
源码:
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
}
例子 设置属性name和nameDesc的值:
public static void main(String[] args) {
List<UserInfo> userInfoList = getUserList();
userInfoList.forEach(obj -> {
functionTest(obj::setName);
functionTest(obj::setNameDesc);
System.out.println(obj);
});
}
public static void functionTest(Consumer<String> consumer){
consumer.accept("name");
}
2.2 Function<T, R> 函数型接口 有入参 有返回值
源码:
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
例子 获取属性nameDesc的值:
public static void main(String[] args) {
List<UserInfo> userInfoList = getUserList();
userInfoList.forEach(obj -> {
functionTest(obj, UserInfo::getNameDesc);
});
}
public static void functionTest(UserInfo userInfo, Function<UserInfo, String> function){
String apply = function.apply(userInfo);
System.out.println(apply);
}
2.3 Supplier<T> 提供型接口 空参但是有返回值
源码:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
例子 获取属性nameDesc的值:
public static void main(String[] args) {
List<UserInfo> userInfoList = getUserList();
userInfoList.forEach(obj -> {
functionTest(obj::getNameDesc);
});
}
public static void functionTest(Supplier<String> supplier){
String s = supplier.get();
}
2.4 Predicat<T> 断言型接口 返回真假
源码:
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
}
例子 计算一个数字是否大于100:
public static void main(String[] args) {
functionTest(50, x -> x > 100);
}
public static void functionTest(int x, Predicate<Integer> predicate){
boolean test = predicate.test(x);
System.out.println(test);
}
3.其他函数式接口
序号 | 接口 | 描述 |
1 | BiConsumer<T,U> | 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
2 | BiFunction<T,U,R> | 代表了一个接受两个输入参数的方法,并且返回一个结果 |
3 | BinaryOperator<T> | 代表了一个作用于于两个同类型操作符的操作,并且返回了 操作符同类型的结果 |
4 | BiPredicate<T,U> | 代表了一个两个参数的boolean值方法 |
5 | BooleanSupplier | 代表了boolean值结果的提供方 |
6 | Consumer<T> | 代表了接受一个输入参数并且无返回的操作 |
7 | DoubleBinaryOperator | 代表了作用于两个double值操作符的操作,并且返回了 一个double值的结果 |
8 | DoubleConsumer | 代表一个接受double值参数的操作,并且不返回结果。 |
9 | DoubleFunction<R> | 代表接受一个double值参数的方法,并且返回结果 |
10 | DoublePredicate | 代表一个拥有double值参数的boolean值方法 |
11 | DoubleSupplier | 代表一个double值结构的提供方 |
12 | DoubleToIntFunction | 接受一个double类型输入,返回一个int类型结果 |
13 | DoubleToLongFunction | 接受一个double类型输入,返回一个long类型结果 |
14 | DoubleUnaryOperator | 接受一个参数同为类型double,返回值类型也为double |
15 | Function<T,R> | 接受一个输入参数,返回一个结果。 |
16 | IntBinaryOperator | 接受两个参数同为类型int,返回值类型也为int |
17 | IntConsumer | 接受一个int类型的输入参数,无返回值 |
18 | IntFunction<R> | 接受一个int类型输入参数,返回一个结果 。 |
19 | IntPredicate | 接受一个int输入参数,返回一个布尔值的结果 |
20 | IntSupplier | 无参数,返回一个int类型结果 |
21 | IntToDoubleFunction | 接受一个int类型输入,返回一个double类型结果 |
22 | IntToLongFunction | 接受一个int类型输入,返回一个long类型结果 |
23 | IntUnaryOperator | 接受一个参数同为类型int,返回值类型也为int |
24 | LongBinaryOperator | 接受两个参数同为类型long,返回值类型也为long |
25 | LongConsumer | 接受一个long类型的输入参数,无返回值 |
26 | LongFunction<R> | 接受一个long类型输入参数,返回一个结果 |
27 | LongPredicate | R接受一个long输入参数,返回一个布尔值类型结果 |
28 | LongSupplier | 无参数,返回一个结果long类型的值 |
29 | LongToDoubleFunction | 接受一个long类型输入,返回一个double类型结果 |
30 | LongToIntFunction | 接受一个long类型输入,返回一个int类型结果 |
31 | LongUnaryOperator | 接受一个参数同为类型long,返回值类型也为long |
32 | ObjDoubleConsumer<T> | 接受一个object类型和一个double类型的输入参数,无返回值 |
33 | ObjIntConsumer<T> | 接受一个object类型和一个int类型的输入参数,无返回值 |
34 | ObjLongConsumer<T> | 接受一个object类型和一个long类型的输入参数,无返回值 |
35 | Predicate<T> | 接受一个输入参数,返回一个布尔值结果 |
36 | Supplier<T> | 无参数,返回一个结果 |
37 | ToDoubleBiFunction<T,U> | 接受两个输入参数,返回一个double类型结果 |
38 | ToDoubleFunction<T> | 接受一个输入参数,返回一个double类型结果 |
39 | ToIntBiFunction<T,U> | 接受两个输入参数,返回一个int类型结果 |
40 | ToIntFunction<T> | 接受一个输入参数,返回一个int类型结果 |
41 | ToLongBiFunction<T,U> | 接受两个输入参数,返回一个long类型结果 |
42 | ToLongFunction<T> | 接受一个输入参数,返回一个long类型结果 |
43 | UnaryOperator<T> | 接受一个参数为类型T,返回值类型也为T |