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

标签 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接口(interface)的对象。 forEach() 以 i 作为参数调用该对象的 accept() 方法。

最佳答案

因为 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 方法。

根据您对问题的评论:

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/

相关文章:

java - 如何多次将事件从组件发送到其父组件?

java - 如何使用 jSTL 通过 <a href> 将值从 jsp 传递到 servlet

java - 如何解析HH :mm into amount of minutes considering locale time separator?

Java 8 过滤器谓词参数索引越界

java - 我应该在 Java 8 Streams 中使用共享可变变量更新吗

java - 某些标点字符与启用的 Pattern.UNICODE_CHARACTER_CLASS 标志不匹配

java - 使用javac在一个包内编译四个java文件

java - 如何将 JSP (HTML) 表的行传递给 servlet?

Java DataOutputStream 不向套接字发送数据

Java 8 在接口(interface)默认方法中使用枚举值