我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.
因此sequential,stream我应该每次使用我吗?
list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流?
list.stream().filter().forEach()
比方说,我有一个List<Integer> ints = new ArrayList<>();,我想将值添加到它,并使用比较并行执行的结果forEach()和Collectors.toList().
首先,我将一些来自顺序IntStream和forEach的值添加到此列表中:
IntStream.range(0,10).boxed().forEach(ints::add);
Run Code Online (Sandbox Code Playgroud)
我得到了正确的结果:
ints ==> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
现在我.clear()在列表中并行执行相同的操作:
IntStream.range(0,10).parallel().boxed().forEach(ints::add);
Run Code Online (Sandbox Code Playgroud)
现在由于多线程,我得到了错误的结果:
ints ==> [6, 5, 8, 9, 7, 2, 4, 3, 1, 0]
Run Code Online (Sandbox Code Playgroud)
现在我切换到收集相同的整数流:
IntStream.range(0,10).parallel().boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我得到了正确的结果:
ints ==> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
问题:
为什么两个并行执行产生不同的Collector结果?为什么产生正确的结果?
如果forEach产生随机结果,也Collector应该.我没有指定任何排序,我认为他在内部添加到我手动使用的列表forEach.由于他并行执行,因此他的add方法应该以未指定的顺序获取值.测试完成了JShell.
编辑:这里没有重复.我理解相关的问题.收集器为什么产生正确的结果?如果他将产生另一个随机结果,我不会问.
以下代码在完成并行处理后并未将所有元素放入目标列表中。这有什么原因吗?
public static void main(String[] args) {
List<Integer> source =new ArrayList<>();
List<Integer> destination = new ArrayList<>();
IntStream.range(0, 10000).forEach(element ->{
source.add(element);
});
//System.out.println(source.size());
source.parallelStream().forEach(c->{
destination.add(c);
});
System.out.println("Source Size:"+source.size());
System.out.println("destination size:"+destination.size());
}
Run Code Online (Sandbox Code Playgroud)
输出:源大小:10000 目标大小:4343
假设我有一个数据类:
data class SensorData(val name: String, val temp : Double)
Run Code Online (Sandbox Code Playgroud)
SensorData我通过 REST 服务或内部 setter 方法创建此对象,但它name始终已填充并且temp可能为空。
此外,我需要通过几个类来获取这个 SensorData 对象,这就是我想到使用singleton.
显然我需要此处描述的object关键字,但是如何组合?data class object