如果 forEach 是一个抽象方法,它如何将 lambda 表达式应用于数组?


List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Sara");
friends.forEach(name -> System.out.println(name));

我正在研究java,我找到了这个例子,我只是把它放在一个主引擎中,它正常打印了数组,所以我的问题是:

在我的理解中name -> System.out.println(name)是用于快速实现打印功能的 lambda 表达式,但我想知道forEach如何将其应用于数组的每个元素?这是一种Iterable接口的方法,因此...空,那么将打印应用于数组中每个名称的代码在哪里?

Arrays.asList在当前实现中返回ArrayList,该实现具有forEach迭代的实现,使用将lambda应用于每个元素的普通for-loop进行迭代。它覆盖(通过某些继承层(并实现Iterable.forEach。当然,它也扩展了List。来自java.util.ArrayList:

for (int i = 0; modCount == expectedModCount && i < size; i++)
action.accept(elementAt(es, i)); 

来自java.util.Arrays:

public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}

forEach是 Iterable 接口的默认方法,默认实现只是针对每个元素的循环调用Consumer进行了增强

for (T t : this)
action.accept(t);

对可迭代对象的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。除非实现类另有指定,否则操作按迭代顺序执行(如果指定了迭代顺序(。操作引发的异常将中继到调用方。

最新更新