Supplier和Consumer 都是一个FunctionalInterface
@FunctionalInterface函数接口只有一个抽象方法
编译器会将任何满足函数接口定义的接口视为函数接口,而不管接口声明中是否存在
FunctionalInterface 注释
先看实际使用例子
public class test {
public static void main(String[] args) {
Supplier<String> supplier = Person::getSkill;
Consumer<String> consumer = Person::doSomething;
consumer.accept(supplier.get());
}
}
class Person {
public static String getSkill() {
return "做饭";
}
public static String getName() {
return "明月新异";
}
public static void doSomething(String thing) {
System.out.println("开始" + thing);
}
}
输出
开始做饭
再看源代码
Supplier的
package java.util.function;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Consumer的
package java.util.function;
import java.util.Objects;
@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); };
}
}
可以看到他们分别都是只有一个抽象方法。
本质上 接受一个Consumer或者Supplier 时,其实就是接受了一个具有这个抽象方法实现的对象。让程序可以天然的接受一段逻辑为参数。
可以看到Consumer的accept方法有入参没有返回值,而这个入参本质上就是给这段空出来的逻辑提供参数。
Supplier 的 get方法就需要一个返回值,且没有入参,这个返回值本质上就是期待这段逻辑的结果。
知道这些之后 我们其实就可以将最开始的代码重新写的更容易理解一些:
public class test {
public static void main(String[] args) {
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return Person.getSkill();
}
};
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
Person.doSomething(s);
}
};
consumer.accept(supplier.get());
}
}
class Person {
public static String getSkill() {
return "做饭";
}
public static String getName() {
return "明月新异";
}
public static void doSomething(String thing) {
System.out.println("开始" + thing);
}
}
其实本质上就是这样,是不是很好理解了。