forEach()方法如何在Java 8中工作

时间:2017-03-12 17:09:24

标签: java java-8

我正在写一个片段:

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()方法。

1 个答案:

答案 0 :(得分:7)

因为Consumerfunctional 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的新字节码操作用于创建消费者实例。