有条件地在嵌套HashMap上流式传输

时间:2019-08-21 18:52:31

标签: java java-8 java-stream

我们假设我们有如下的Map结构:

Map<Type, Map<String, String>> outterMap = new HashMap<>();
Map<String, String> innerMap1 = new HashMap<>();

innerMap1.put("1", "test1");
innerMap1.put("2", "test2");
innerMap1.put("3", "test3");
innerMap1.put("4", "test4");

Map<String, String> innerMap2 = new HashMap<>();

innerMap2.put("5", "test5");
innerMap2.put("6", "test6");
innerMap2.put("3", "test7");

outterMap.put(Type.TEXT, innerMap1);
outterMap.put(Type.INTEGER, innerMap2);

,我们希望打印带有分配的Type枚举的innerMap中的所有值。使用foreach循环,它看起来像这样:

for (Type type : outterMap.keySet()) {
    for (String value : outterMap.get(type).values()) {
        if(type.equals(Type.TEXT)) {
            System.out.println("TEXT: " + value);
        }else if(type.equals(Type.INTEGER)) {
            System.out.println("INTEGER: " + value);
        }
    }
}

因此控制台上的输出如下所示:

TEXT: test1
TEXT: test2
TEXT: test3
TEXT: test4
INTEGER: test7
INTEGER: test5
INTEGER: test6

是否有任何选择可以借助流来编写它。我可以在lambda上使用流,它看起来像这样:

outterMap.keySet().stream().forEach(type -> {
            outterMap.get(type)
            .values()
            .stream()
            .forEach(value -> {
                if(type.equals(Type.TEXT)) {
                    System.out.println("TEXT: " + value);
                } else if (type.equals(Type.INTEGER)) {
                    System.out.println("INTEGER: " + value);
                }
            });
        });

3 个答案:

答案 0 :(得分:3)

可能是这样:

outterMap.keySet()
         .stream()
         .flatMap(x -> outterMap.getOrDefault(x, Collections.emptyMap())
                                .values()
                                .stream()
                                .map(y -> new SimpleEntry<>(x, y)))
         .forEachOrdered(entry -> {
               System.out.println(entry.getKey() + "  " + entry.getValue());
         });

但这远比您所拥有的可读性差。

答案 1 :(得分:0)

您可以在外部Map#entrySet上进行流传输并获取每个条目,并在Map.Entry回调中打印出外部Map的键和内部forEach()的值:

outterMap.entrySet()
         .stream()
         .forEach(e -> e.getValue()
                        .values()
                        .forEach(v -> System.out.println(e.getKey()+ " " + v)));

输出:

TEXT test1
TEXT test2
TEXT test3
TEXT test4
INTEGER test7
INTEGER test5
INTEGER test6

答案 2 :(得分:0)

outterMap.keySet().forEach(type -> outterMap.get(type)
        .values()
        .stream()
        .map(value -> transform(type, value))
        .forEach(System.out::println));

String transform(final Scratch.Type type, final String value) {
    return type + ": " + value;
}