我正在写一个片段:
List<Integer> list=Arrays.toList(2,4,6,8);
list.forEach(i -> System.out.println(i));
请在上面的代码片段中解释一下方法调用的流程。 forEach()方法如何将参数传递给accept()方法? forEach()方法每次都调用accept方法吗? 如果我错了,请纠正我。
i-> System.out.println(i)
返回Consumer接口的对象。 forEach()以i作为参数调用该对象的accept()方法。
答案 0 :(得分:7)
因为Consumer
是functional interface,所以lambda函数可以隐含地满足它。所以当你这样做时
list.forEach(i -> System.out.println(i));
你正在做什么概念(下面更多)是
list.forEach(new Consumer<String>() {
@Override
public void accept(String i) {
System.out.println(i);
}
});
然后将实例传递到forEach
,为列表中的每个条目调用其accept
方法。
根据您对该问题的评论:
我很困惑首先调用哪个方法。它是“forEach()”还是“accept()”,因为它们都在努力收集!
事情的顺序是:
invokedynamic
操作) forEach
,传入该引用forEach
的代码多次调用 accept
,每次将一个列表项传递给它(它收到i
)注意我说概念。编译器并不真正创建匿名类;相反,一个名为invokedynamic
的新字节码操作用于创建消费者实例。