Java Lambda如何将List<Object[]>映射为ID对应startSeq递增的Map
解决方案
方案1:基于索引遍历实现(推荐,无并发/顺序问题)
直接遍历events的索引范围,同时关联事件ID和递增序列即可,完美解决你提到的流无法同时关联索引和元素的问题:
Map<Integer, Integer> eventSeqMap = IntStream.range(0, events.size()) .boxed() .collect(Collectors.toMap( // 键:取第i个元素的0下标作为事件ID i -> (Integer) events.get(i)[0], // 值:起始值+索引实现递增 i -> startSeq + i ));
该方案不需要额外维护中间变量,元素和序列的对应关系有严格保障,也兼容并行流场景。
方案2:基于AtomicInteger维护递增序列
如果不想遍历索引,也可以用原子类记录递增序列,仅适用于顺序流场景:
AtomicInteger seqCounter = new AtomicInteger(startSeq); Map<Integer, Integer> eventSeqMap = events.stream() .collect(Collectors.toMap( event -> (Integer) event[0], event -> seqCounter.getAndIncrement() ));
注意:如果使用并行流,该方案的序列值和事件的对应关系会错乱,仅推荐在明确为顺序流的场景下使用。
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

