简单了解了函数式接口,接着我们就来看看Java8 的四大核心函数式接口吧!
一、消费型接口:
基本格式
Consumer<T>
接受一个输入参数并且无返回值。
方法调用:
void accept(T t);
使用示例:
@Test
public void testConsumer() {
handle(6, (x) -> System.out.println(x + 2));
}
public void handle(int value, Consumer<Integer> consumer) {
consumer.accept(value);
}
因为没有出参,所以常用于打印、发送短信等消费动作。
二、供给型接口
基本格式:
Supplier<T>
方法调用:
T get();
使用示例:
@Test
public void testSupplier() {
Person person = Person.builder()
.name("供给者")
.build();
System.out.println(getObject(() -> person.getName()));
}
public String getObject(Supplier<String> supplier) {
return supplier.get();
}
常用于符合条件时调用获取结果;运行结果提前定义,但不运行。
三、函数型接口
基本格式:
Function<T,R>
接受一个输入参数T,返回一个结果R。
方法调用:
R apply(T t);
使用示例:
@Test
public void testFunction() {
int result = plusTwo(6, (x) -> x + 2);
System.out.println(result);
int before = before(6, x -> x + 2, x -> x * 10);
// 62
System.out.println(before);
int after = after(6, x -> x + 2, x -> x * 10);
// 80
System.out.println(after);
}
public Integer plusTwo(int origen, Function<Integer, Integer> function) {
return function.apply(origen);
}
public Integer before(int value, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {
// value作为function2的参数,返回一个结果,该结果作为function1的参数,返回一个最终结果
return function1.compose(function2).apply(value);
}
public Integer after(int value, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {
// value作为function1的参数,返回一个结果,该结果作为function2的参数,返回一个最终结果
return function1.andThen(function2).apply(value);
}
四、断言型接口
基本格式:
Predicate<T>
接受一个输入参数T,返回一个布尔值结果。
方法调用:
boolean test(T t);
使用示例:
@Test
public void testPredicate() {
boolean judge = judge(6, (x) -> (x & 1) != 1);
System.out.println(judge);
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println("输出所有数据:");
eval(list, x -> true);
// 1 2 3 4 5 6 7 8 9
System.out.println();
System.out.println("输出所有偶数:");
eval(list, x -> (x & 1) != 1);
// 2 4 6 8
System.out.println();
System.out.println("输出大于 3 的所有数字:");
eval(list, x -> x > 3);
// 4 5 6 7 8 9
System.out.println();
// 验证输入是否正确
boolean valid = valid("许宣", x -> !x.isEmpty() && x.length() <= 3);
System.out.println(valid);
}
public boolean judge(Integer input, Predicate<Integer> predicate) {
return predicate.test(input);
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for (Integer n : list) {
if (predicate.test(n)) {
System.out.print(n + " ");
}
}
}
public boolean valid(String name, Predicate<String> predicate) {
return predicate.test(name);
}