快速提问,我想将以下Map<String, Map<String, Integer>>
压缩成另一个对象。我目前正在做的方法是在流中嵌入一个流,我不太喜欢,有没有办法以线性方式执行此操作。
this.ourMap.entrySet().stream()
.flatMap(player ->
player.getValue().entrySet().stream()
.map(game -> new TransformedMap("StaticID", player.getKey(), game.getKey(), game.getValue())))
.collect(Collectors.toList());
答案 0 :(得分:0)
使用我的免费StreamEx库,这看起来会更简单:
list = EntryStream.of(this.ourMap)
.flatMapValues(games -> games.entrySet().stream())
.mapKeyValue((player, game) ->
new TransformedMap("StaticID", player, game.getKey(), game.getValue()))
.toList();
这里使用的EntryStream
类扩展了Stream<Map.Entry>
并提供了一些额外的方便方法。在内部它变成了这样的东西:
list = this.ourMap.entrySet().stream()
.<Entry<String, Entry<String, Integer>>>flatMap(entry -> entry.getValue().entrySet()
.stream().map(e -> new AbstractMap.SimpleImmutableEntry<>(entry.getKey(), e)))
.map(entry ->
new TransformedMap("StaticID", entry.getKey(), entry.getValue().getKey(), entry.getValue().getValue()))
.collect(Collectors.toList());