如何用Java Stream API实现集合转换并满足指定顺序要求?
使用Java Stream API实现嵌套集合转换,同时满足顺序要求
当然可以用Stream API实现完全等价的逻辑,而且刚好能满足你对同一key生成的MyObject连续、保留value顺序的要求!
先直接上实现代码:
List<MyObject> transform(Collection<Map.Entry<String, List<String>>> input) { return input.stream() // 遍历每个Entry,将其对应的value列表转成MyObject流 .flatMap(entry -> entry.getValue().stream() .map(value -> new MyObject(entry.getKey(), value))) // 收集成List,默认保持流的顺序 .collect(Collectors.toList()); }
关于顺序的说明:
- 因为我们使用的是顺序流(
input.stream()而非parallelStream()),Stream会严格按照输入集合的遍历顺序处理每个Map.Entry。 - 每个
Entry里的List<String>是有序的,它的stream()会保留原列表的元素顺序,所以每个key对应的MyObject会按value的顺序生成;同时因为我们是一次性处理完一个Entry的所有value才会处理下一个Entry,所以同一key的MyObject必然是连续的。 - 至于外部集合的无序性,这和你原代码的行为一致:不同key之间的顺序无法保证,但同一key内部的顺序和连续性完全符合要求。
这个实现和你原来的循环逻辑完全等价,而且代码更简洁易读。
内容的提问来源于stack exchange,提问作者Matthias Ronge
相关产品推荐
相关产品推荐

