有这样的代码
List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo");
strings.forEach(string -> System.out.println(string));
目前尚不清楚它是如何工作的,除了我知道 lambda 可以工作,因为 Consumer 接口是一个函数式接口。
但其余的非常混乱。也许整个问题是我难以理解位于 Iterable 接口中的以下表达式
default void forEach(Consumer<? super T> action) {/*содержание тела метода
мне понятна, поэтому не
скопировал тут*/}
请求:一步一步写出这段代码的算法会很有用。
注意:如果突然发现这个问题是重复的,那么只需将链接粘贴在评论中,不要投反对票。如果链接的内容给出了详尽的答案,那么我将删除我的问题。
我解释说该方法
forEach()作为一个参数функциональный интерфейс,即接口Consumer<T>。功能接口是只有一个方法的接口。他们需要什么?主要用于 lambda 表达式。因此,该功能接口的结构如下所示:也就是说,这个接口接受某种类型的参数
T并且什么都不返回(void)。它也只有一种方法 -accept(). 要“激活”我们的操作,我们需要调用方法accept(),例如,我们必须使用匿名类来实现该方法,如下所示:同意,每次都创建一个匿名类不是很方便。但对我们来说幸运的是,lambda 表达式将我们从这个例程中解放出来。要执行这个方法,我们只需要写:
s -> System.out.println(s).s我们传递给幻像方法的参数accept()在哪里,System.out.println(s)我们在该方法中执行的操作在哪里accept()。顺便说一句,传递对方法的引用要容易得多:forEach(System.out::println). 在这种情况下,每个枚举变量自动成为我们传递给方法的参数accept(),并为每个我们执行方法System.out.println()。使用来源,卢克
原始来源非常清楚地显示了默认实现,即:
粗略地说,一个设计位于胆量
for-each中,它通过以下方式起作用: