当前位置: 首页 > 知识库问答 >
问题:

我应该使用共享可变变量更新Java8流

仰城
2023-03-14

只是在列表下面迭代

List<String> list1 = Arrays.asList("A1","A2","A3","A4","A5","A6","A7","A8","B1","B2","B3");
List<String> list2 = new ArrayList<>();

Consumer<String> c = t -> list2.add(t.startsWith("A") ? t : "EMPTY");

list1.stream().forEach(c);
list1.parallelStream().forEach(c);
list1.forEach(c);

以上三个迭代有什么区别

共有3个答案

澹台阳秋
2023-03-14

在使用流时,您应该以这样的方式编写代码:如果切换到并行流,它不会产生错误的结果。

想象一下,如果您在代码中对同一个共享内存(list2)进行读写操作,并将您的进程分布到几个线程中(使用并行流)。那你就完了。因此,你有几个选择。

使共享内存(list2)线程安全。例如,通过使用AtomicReferences

List<String> list2 = new ArrayList<>();
AtomicReference<List<String>> listSafe = new AtomicReference<>();
listSafe.getAndUpdate(strings -> {strings.add("newvalue"); return strings;}); 

或者,您可以使用纯函数式方法(没有副作用的代码),例如@Eran解决方案。

卫甫
2023-03-14

从功能上来说,对于简单的情况它们几乎是相同的,但是一般来说,有一些隐藏的差异:

    < li >让我们首先引用< code>forEach的Javadoc中关于可迭代用例的陈述:

为Iterable的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。

此外,我们还可以迭代一个集合并对每个元素执行给定的操作——只需传递一个实现 Consumer 接口的类

void forEach(Consumer<? super T> action)

https://docs . Oracle . com/javase/8/docs/API/Java/lang/iterable . html # forEach-Java . util . function . consumer-

https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#fail-fast

更多信息:

    < li >有什么区别。foreach和。流()。foreach? < Li > collection . stream()与。forEach()和Collection.forEach()?
姚高韵
2023-03-14

无论使用并行流还是顺序,当目标是生成列表时,都不应使用 forEach。将地图收集一起使用:

List<String> list2 = 
    list2.stream()
         .map(item -> item.startsWith("A") ? item : "EMPTY")
         .collect(Collectors.toList());
 类似资料:
  • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两

  • 一般情况下,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量被复制到每台机器上,并且这些变量在远程机器上 的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变量(broadcast variable)和累加器(acc

  • Shared variables (共享变量)是为所有模板定义的变量。可以使用 setSharedVariable 方法向配置中添加共享变量: Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); ... cfg.setSharedVariable("warp", new WarpDirective()); cfg

  • 从…起http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html : 不要提供“setter”方法——修改字段或字段引用的对象的方法。使所有字段都是最终的和私有的。不要允许子类重写方法。最简单的方法是将类声明为最终的。一个更复杂的方法是使构造函数私有,并在工厂方法中构造实例。如果实例字段包括对可变对象的引用,不

  • 主要内容:广播变量,累加器在Spark中,当任何函数传递给转换操作时,它将在远程集群节点上执行。它适用于函数中使用的所有变量的不同副本。这些变量将复制到每台计算机,并且远程计算机上的变量更新不会恢复到驱动程序。 广播变量 广播变量支持在每台机器上缓存的只读变量,而不是提供任务的副本。Spark使用广播算法来分发广播变量以降低通信成本。 spark动作的执行经过几个阶段,由分布式“shuffle”操作分开。Spark自动广播

  • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两