收集Map.Entry的第一个值到地图中

问题描述 投票:0回答:1

我有以下地图。

private static Map<String, String[]> createMap(){
    Map<String, String[]> map = new HashMap<>();
    map.put("A", new String[]{null});
    map.put("B", new String[]{"Banana"});
    map.put("C", new String[]{""});
    map.put("D", new String[]{"Duck"});
    return map;
}

我想把这张地图转换成 Map<String, String>

需要输出 :

键:B值:香蕉

键:D值:鸭子

我想用 Java 8 Stream APIs 而我尝试的一个解决方案是

final Map<String, String[]> collect = createMap().entrySet().stream()
        .filter(e -> e.getValue()[0] != null && !"".equals(e.getValue()[0]))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

collect.forEach((key, value) -> System.out.println("Key :" + key + " Value :" + Arrays.toString(value)));

但这是给我 Map<String, String[]> 和输出是

键:B 值:[香蕉]

键:D值:[鸭子]

我怎样才能告诉Collector只从 Map.Entry 价值?

collections java-8 hashmap java-stream collectors
1个回答
5
投票

你可以这样做。

map.entrySet().stream()
          .filter(entry -> Stream.of(entry.getValue()[0])
                                .anyMatch(s -> s != null && !s.isEmpty()))
          .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue()[0]))

通过你的代码。

Map<String, String> collect = map.entrySet().stream()
            .filter(e -> e.getValue()[0] != null && !e.getValue()[0].isEmpty())
            .collect(Collectors.toMap(Map.Entry::getKey, entry->entry.getValue()[0]));
© www.soinside.com 2019 - 2024. All rights reserved.