java8 +每个循环的内部工作

时间:2018-05-05 11:36:18

标签: java foreach java-8 java-stream

我是java8的新手。我试图理解Streams中foreach循环的工作。 我的代码如下: -

Stream<String> s = someist.stream();
Consumer<String> consumer = (String s1)->System.out.println(s1);
s.forEach(consumer);

问题是当我刚刚传递Consumer的引用而不是在其中调用consumer.accept(T t)时,foreach循环如何知道调用consumer.accept(T t)。虽然,当我们为函数接口提供一些lambda表达式时,我们需要调用它的抽象方法,但我们不是在这里调用它。 那么foreach循环如何知道它应该作为参数提供的消费者引用呢?

3 个答案:

答案 0 :(得分:1)

forEach的具体实施将调用accept,例如:

public class MyStream implements Stream<String> {

    @Override
    public void forEach(Consumer<? super String> action) {
        while (hasNext()) {
            action.accept(next());
        }
    }

    ...
}

答案 1 :(得分:1)

正如java doc所述:

  

void forEach​(Consumer<? super T> action)

     

为每个人执行操作   这个流的元素。

,传递给forEach方法的行为参数将在内部为源的每个元素调用。

答案 2 :(得分:-1)

这就是Functional Interface的工作原理。他们只有一个abstract方法。可能有可选的default方法。 abstract方法的行为以lambda expression的形式传递(传递行为就像数据一样)。反过来,此行为是abstract的{​​{1}}方法的方法正文。使用名称调用Functional Interface方法。

因此,当您将default作为方法参数传递给另一个方法时,在这种情况下,Functional Interface传递给Consumer<T>接口的forEach()方法,其抽象方法{为流的每个项调用{1}}。

这样说,从逻辑上讲,如果仅将java.util.stream.Stream作为参数传递,则只能调用一个方法。