下面的 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; });我错过了什么?我该如何解决?
2 回答
智慧大石
TA贡献1946条经验 获得超3个赞
在您的第一个代码示例中,您将 lambda 表达式分配() -> msg
给tasks
数组的每个元素。
但是,在第二个示例中,您将 lambda 表达式分配() -> msg
给类型为 的临时变量。的目的是将流的元素传递给以某种方式使用这些元素的消费者。如果您以某种方式分配给消费者的参数,流的来源将不会反映这一点。这样的操作甚至可能没有任何意义:t
Callable<String>
Stream#forEach
IntStream.range(1,10).filter((x) -> (x % 2 == 0)).forEach((x) -> {++x;});
这与 Java 流的一般主题相关:它们是用于生成、转换、过滤和使用数据的单向管道。当数据从Arrays.stream
供应商流出时,它只能沿一个方向流入消费者 ( forEach
);下游所做的更改不会传播回上游。
12345678_0001
TA贡献1802条经验 获得超5个赞
您的流代码等效于以下for
循环:
for (Callable<String> t : tasks) { t = () -> message; }
它本身相当于:
for (int i = 0; i < tasks.length; i++) { Callable<String> t = tasks[i]; t = () -> msg; }
改变 的值t
不会改变 的值tasks[i]
。
要创建长度messageCount
为 lambda 表达式的数组,请使用流:
Callable<String>[] tasks = IntStream.range(0, messageCount) .mapToObj(i -> (Callable<String>) () -> msg) .toArray(Callable[]::new);
添加回答
举报
0/150
提交
取消