Java 8,展平地图

时间:2015-11-13 10:15:14

标签: java lambda java-8

快速提问,我想将以下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());

1 个答案:

答案 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());