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