@FunctionalInterface
interface StringConsumer extends Consumer<String> {
@Override
public default void accept(String s) {
System.out.println(s.toUpperCase());
}
void print(String s);
}
public class Test {
public static void main(String[] args) {
StringConsumer stringConsumerImpl= s -> System.out.println(s.toLowerCase());
List<String> list = Arrays.asList("Dr", "Mr", "Miss", "Mrs");
list.forEach(stringConsumerImpl);
}
}
输出:DR MR MISS MRS
所以这段代码对我来说真的很奇怪。我实际上提供了打印方法的实现,但当我运行代码时,它实际上使用了默认方法的实现。
我期望打印实现能够工作。编辑:当从 StringConsumer 中删除打印方法时,它会导致主方法出现编译错误
你有
缩写为:
它有两种方法
accept
:print
调用
stringConsumerImpl.accept()
的每个元素list
。它不知道
print
。为了获得理想的结果,你需要这样调用它
Iterable.forEach
实现如下:它调用你传入的
accept
的方法,所以这就是为什么调用 而不是。就这么简单。Consumer
accept
print
您可能以为这
forEach
会调用您传入的任何lambda 表达式print
。事实并非如此。lambda 表达式只是创建具有单个抽象方法的接口实现的一种奇特方式。lambda 表达式的主体是该单个抽象方法 ( ) 的实现。它只是为您省去了编写这样的类并创建其实例的麻烦:该接口可以自由地拥有其他默认方法,其他方法可以选择调用这些默认方法,而不是 lambda 实现的抽象方法。它就像接口类型的其他每个变量一样。