下面的 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给类型为 的临时变量。的目的是将流的元素传递给以某种方式使用这些元素的消费者。如果您以某种方式分配给消费者的参数,流的来源将不会反映这一点。这样的操作甚至可能没有任何意义:tCallable<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
提交
取消
