Stream流代替双重for循环方案小记:
// 总急减速
AtomicReference<Integer> totalRd = new AtomicReference<>(0);
// 总急加速
AtomicReference<Integer> totalRa = new AtomicReference<>(0);
// 总急转弯
AtomicReference<Integer> totalAst = new AtomicReference<>(0);
AtomicInteger index = new AtomicInteger(0);
gpsList.stream().forEach(gps -> {
index.getAndIncrement();
AtomicInteger index2 = new AtomicInteger(0);
traceLists.stream().anyMatch(trace -> {
index2.getAndIncrement();
if (index.get() == index2.get()){
trace.setASharpTurn(gps.getASharpTurn());
trace.setRapidDeceleration(gps.getRapidDeceleration());
trace.setRapidAcceleration(gps.getRapidAcceleration());
totalRd.updateAndGet(v -> v + gps.getRapidDeceleration());
totalRa.updateAndGet(v -> v + gps.getRapidAcceleration());
totalAst.updateAndGet(v -> v + gps.getASharpTurn());
}
return false;
});
});
解析:
stream().anyMatch():判断的条件里,任意一个元素成功,返回true
相关方法:
allMatch:判断条件里的元素,所有的都是,返回true
noneMatch:与allMatch相反,判断条件里的元素,所有的都不是,返回true
AtomicInteger:原子性操作,实现基于CAS(compare-and-swap直译即比较并交换)
AtomicReference:与AtomicInteger相比,前者是对整数的封装,AtomicReference是对普通对象的封装(这里为了介绍AtomicReference,所以采用AtomicReference,可以替换为AtomicInteger)。
getAndIncrement(): Integer递增+1。
updateAndGet(): Integer += 操作。
注*:在能确定数据量小的情况下,个人还是建议直接使用双重for比较好!