如何将Java中的for循环转换为stream流并获取当前迭代索引?
解决方案
Stream API默认不会携带元素的原始索引,你需要从索引入手构建流来实现需求,推荐两种实现方式:
方案1:和原for逻辑完全对齐的写法
直接生成索引范围流遍历,逻辑和你原有的for循环完全一致,适合需要兼容原有变量操作的场景:
IntStream.range(0, carList.size()) .forEach(i -> { String country = carList.get(i).getCountry(); List<Integer> indexes = carsToIndexMap.getOrDefault(country, new ArrayList<>()); indexes.add(i); carsToIndexMap.put(country, indexes); });
注意:该写法适合carList是支持随机访问的实现(比如ArrayList),性能和原生for循环一致
方案2:更简洁的函数式收集写法
直接用收集器生成目标Map,不需要提前声明carsToIndexMap,也规避了并行流修改外部变量的线程安全问题:
Map<String, List<Integer>> carsToIndexMap = IntStream.range(0, carList.size()) .boxed() .collect(Collectors.groupingBy( i -> carList.get(i).getCountry(), Collectors.toList() ));
原写法的问题说明
你之前的写法只提取了元素的国家属性和对应的列表,但是全程没有保留索引信息,单纯遍历元素的Stream无法获取元素在原集合的下标,所以必须从索引入手构建流才能实现需求。
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

