Stream流代替双重for循环方案小记:

    1. // 总急减速
    2. AtomicReference<Integer> totalRd = new AtomicReference<>(0);
    3. // 总急加速
    4. AtomicReference<Integer> totalRa = new AtomicReference<>(0);
    5. // 总急转弯
    6. AtomicReference<Integer> totalAst = new AtomicReference<>(0);
    7. AtomicInteger index = new AtomicInteger(0);
    8. gpsList.stream().forEach(gps -> {
    9. index.getAndIncrement();
    10. AtomicInteger index2 = new AtomicInteger(0);
    11. traceLists.stream().anyMatch(trace -> {
    12. index2.getAndIncrement();
    13. if (index.get() == index2.get()){
    14. trace.setASharpTurn(gps.getASharpTurn());
    15. trace.setRapidDeceleration(gps.getRapidDeceleration());
    16. trace.setRapidAcceleration(gps.getRapidAcceleration());
    17. totalRd.updateAndGet(v -> v + gps.getRapidDeceleration());
    18. totalRa.updateAndGet(v -> v + gps.getRapidAcceleration());
    19. totalAst.updateAndGet(v -> v + gps.getASharpTurn());
    20. }
    21. return false;
    22. });
    23. });

    解析:

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