Java是否有类似于c ++的组合功能?
Does Java have something similar to c++'s combinable?
我使用.parallelStream().forEach()
做一堆写到DB,但也想保持我写的行计数。
现在,我有一个java.util.concurrent.atomic.AtomicInteger
来跟踪计数,但我想使用类似于c++的combinable<>
的东西。
combinable<>
的示例:
#include <iostream>
#include <cstdint>
#include <ppl.h>
using namespace Concurrency;
const int max_sum_item = 1000000000;
int main()
{
combinable<uint64_t> part_sums([] { return 0; });
parallel_for(0, max_sum_item,
[&part_sums] (int i)
{
part_sums.local() += i;
}
);
uint64_t result = part_sums.combine(std::plus<uint64_t>());
if (result != uint64_t(499999999500000000))
throw;
}
是否有一个等效的combinable<>
类在Java中?
AtomicInteger totalRows = new AtomicInteger(0);
...
myList.parallelStream().forEach(
... // write to db
totalRows.addAndGet(rowsWritten);
...
);
print(totalRows.get());
查找如下内容:
Combinable<int> totalRows = new Combinable<>(0);
...
myList.parallelStream().forEach(
... // write to db
totalRows = rowsWritten;
...
);
print(totalRows.combine());
编辑:根据@zero323, Spark中正确的工具将是Accumulator
。我对多线程的情况更感兴趣,但手头没有一个非spark的例子。
EDIT2:更新示例(并删除Spark引用)
Spark中合适的工具是Accumulator
:
Accumulator<Integer> accum = sc.accumulator(0);
myRDD.parallelStream().forEach(
accum.add(1);
);
accum.value();
从工作者的角度来看,累加器是只写的,并且只能由驱动程序读取。默认情况下,它只支持Long
, Double
和Float
,但您可以实现自定义AccumulatorParam
来支持其他类型。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 带内存和隔离功能的SQLite
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 有没有办法组合多个几乎相同的功能?
- 如何简化代码并将开关组合成一个功能?
- OpenCV 错误的解决方案:不支持的格式或格式组合 - 当将 ORB 功能与 FlannBasedMatcher 匹配
- 如何正确组合类型的别名,功能指针和模板功能
- 变异模板和变异功能组合
- 将功能委托/转发给成员(组合)
- 可组合C++功能装饰器
- 具有可变参数模板的功能组合
- Java是否有类似于c ++的组合功能?