我正在写一个片段:
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接口(interface)的对象。 forEach() 以 i 作为参数调用该对象的 accept() 方法。
最佳答案
因为 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
方法。
根据您对问题的评论:
I am confused which method is invoked first. Is it the "forEach()" or the "accept ()" because both of them are working togather!
事情的顺序是:
- 创建匿名类的实例(实际上,通过
invokedynamic
操作) forEach
被调用,传入该引用forEach
的代码重复调用accept
,每次将列表项之一传递给它(它接收为我
)
请注意,我说的是概念上的。匿名类并不是真正由编译器创建的;相反,一个名为 invokedynamic
的新字节码操作用于创建消费者实例。
关于java - forEach() 方法如何在 Java 8 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42750458/