如何用单条Java Stream实现列表合并、打乱后映射为带自增索引的HashMap
现有代码问题说明
你当前写法里的Collectors.toMap(index++, Object::toString)存在逻辑错误:index++只会在调用toMap方法时执行1次,无法为每个元素生成自增的key;同时在流操作中使用外部可变计数器属于不良实践,并行流场景下会出现线程安全问题,得到错误的计数结果。
正确的单条Stream实现
以下实现兼容Java 8及以上版本,完全符合你的需求:
private final Map<Integer, String> _options = Stream .concat( _question.getIncorrectAnswers().stream(), Stream.of(_question.getCorrectAnswer()) ) .collect(Collectors.collectingAndThen( Collectors.toList(), collected -> { Collections.shuffle(collected); // 生成从1开始的自增key,映射对应元素 return IntStream.rangeClosed(1, collected.size()) .boxed() .collect(Collectors.toMap( indexKey -> indexKey, indexKey -> collected.get(indexKey - 1) )); } ));
实现逻辑说明
- 前半段
Stream.concat逻辑和你的原有逻辑一致,用于合并错误答案列表和正确答案 - 用
Collectors.collectingAndThen将合并后的流收集为列表后,直接调用Collections.shuffle打乱列表顺序 - 最后通过
IntStream.rangeClosed生成从1到列表长度的整数作为自增key,由于列表下标从0开始,取indexKey - 1位置的元素作为value,直接收集为目标HashMap - 整个逻辑完全封装在单条Stream语句内,没有引入外部可变状态,符合函数式流的设计规范。
内容的提问来源于stack exchange,提问作者Girls are beautiful
相关产品推荐
相关产品推荐

