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比较好!
