为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2023-03-09 10:25:53
下面的 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 表达式分配() -> msgtasks数组的每个元素。

但是,在第二个示例中,您将 lambda 表达式分配() -> msg给类型为 的临时变量。的目的是将流的元素传递给以某种方式使用这些元素的消费者。如果您以某种方式分配给消费者的参数,流的来源将不会反映这一点。这样的操作甚至可能没有任何意义:tCallable<String>Stream#forEach

IntStream.range(1,10).filter((x) -> (x % 2 == 0)).forEach((x) -> {++x;});

这与 Java 流的一般主题相关:它们是用于生成、转换、过滤和使用数据的单向管道。当数据从Arrays.stream供应商流出时,它只能沿一个方向流入消费者 ( forEach);下游所做的更改不会传播回上游。


查看完整回答
反对 回复 2023-03-09
?
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);


查看完整回答
反对 回复 2023-03-09
  • 2 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信