我是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循环如何知道它应该作为参数提供的消费者引用呢?
答案 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
作为参数传递,则只能调用一个方法。