Java for循环与Stream .forEach之间有什么区别

下面的 for 循环生成一组 lambda 表达式。


 Callable<String>[] tasks = new Callable[messageCount];

 for (int i = 0; i < count; i++) {

   tasks[i] = () -> msg;

 }

对流 forEach 进行相同的尝试会产生空值。


 Arrays.stream(tasks).forEach(t -> {

   t = () -> message;

 });

我错过了什么?我该如何解决?


慕丝7291255
浏览 233回答 2
2回答

智慧大石

在您的第一个代码示例中,您将 lambda 表达式分配() -> msg给tasks数组的每个元素。但是,在第二个示例中,您将 lambda 表达式分配() -> msg给类型为 的临时变量。的目的是将流的元素传递给以某种方式使用这些元素的消费者。如果您以某种方式分配给消费者的参数,流的来源将不会反映这一点。这样的操作甚至可能没有任何意义:tCallable<String>Stream#forEachIntStream.range(1,10).filter((x)&nbsp;->&nbsp;(x&nbsp;%&nbsp;2&nbsp;==&nbsp;0)).forEach((x)&nbsp;->&nbsp;{++x;});这与 Java 流的一般主题相关:它们是用于生成、转换、过滤和使用数据的单向管道。当数据从Arrays.stream供应商流出时,它只能沿一个方向流入消费者 (&nbsp;forEach);下游所做的更改不会传播回上游。

12345678_0001

您的流代码等效于以下for循环:for&nbsp;(Callable<String>&nbsp;t&nbsp;:&nbsp;tasks)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;()&nbsp;->&nbsp;message; }它本身相当于:for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;tasks.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Callable<String>&nbsp;t&nbsp;=&nbsp;tasks[i]; &nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;()&nbsp;->&nbsp;msg; }改变 的值t不会改变 的值tasks[i]。要创建长度messageCount为 lambda 表达式的数组,请使用流:Callable<String>[]&nbsp;tasks&nbsp;=&nbsp;IntStream.range(0,&nbsp;messageCount) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(i&nbsp;->&nbsp;(Callable<String>)&nbsp;()&nbsp;->&nbsp;msg) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toArray(Callable[]::new);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java