函数式接口

  • 将方法作为参数传递
  • lamba表达式
  • 将数学函数抽象成接口对象

Consumer:消费型接口

抽象方法:void accept(T t) 接收一个参数进行消费,但无需返回结果

1
2
Consumer c1 = (x) -> System.out.println(x); //单个入参和方法可简写 c1 = System.out::println
c1.accept("hello world") //实现 打印hello world

默认方法:andThen(Consumer<? super T> after) 先执行调用andThen的accept方法,再执行andThen方法中参数after的accept方法

1
2
3
Consumer c1 = (x) -> System.out.println("c1" + x);
Consumer c2 = (x) -> System.out.println("c2" + x);
c1.andThen(c2).accept("go") //输出 c1go c2go

Supplier: 供给型接口

抽象方法:T get(),无参数,有返回值。适合提供数据的场景使用

1
2
Supplier<String> s0 = () -> "SSS";
s0.get() //获取到 SSS

Function<T,R>: 函数型接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
R apply(T t);

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}

static <T> Function<T, T> identity() {
return t -> t;
}

抽象方法:apply 传入一个参数,返回想要的结果

1
2
Function<Integer, Integer> f1 = (x) -> x * x;
f1.apply(2) //输出12

默认方法:compose 先执行 compose方法的参数before中的apply方法,然后将执行结果传递给调用compose函数中的apply再执行一次

1
2
3
Function<Integer, Integer> f1 = (x) -> x * x;
Function<Integer, Integer> f2 = (x) -> 2 * x;
f1.compose(f2).apply(2) //先执行 f2,再把结果值去执行f1 x * (2 * x) = 16

默认方法:andThen 先执行调用andThen函数的apply方法,然后将执行结果传递给andThen方法的参数after去执行apply方法

1
2
3
Function<Integer, Integer> f1 = (x) -> x * x;
Function<Integer, Integer> f2 = (x) -> 2 * x;
f1.andThen(f2).apply(2) //先执行 f1,再把结果值去执行f2 (x * x) * 2 = 8

静态方法 identity 输入什么就返回什么

1
2
Function<Integer, Integer> f0 = Function.identity();
f0.apply(2) //输出2

Predicate :断言型接口

抽象方法:boolean test(T t) 传入一个参数,返回一个布尔值

1
2
Predicate<Integer> p0 = (x) -> x < 10;
p0.test(1); //输出 true

默认方法:and(Predicate<? super T> other),相当于逻辑运算符中的&&,当两个Predicate函数的返回结果都为true时才返回true。

默认方法:negate(),这个方法的意思就是取反。

默认方法:or(Predicate<? super T> other) ,相当于逻辑运算符中的||,当两个Predicate函数的返回结果有一个为true则返回true,否则返回false。

默认方法:isEqual(Object targetRef),对当前操作进行”=”操作,即取等操作,可以理解为 A == B。

BiFunction<T, U, R> 多个参数接口

  • T:函数的第一个参数类型
  • U:函数的第二个参数类型
  • R:函数的结果类型
1
2
3
BiFunction<Integer, Integer, Integer> b1 = (x, y) -> x + y; //实现两数相加

BiFunction<Integer, Function<Integer, Integer> >