Java8 Streams:过滤掉地图

时间:2018-04-12 19:21:48

标签: java-8

我试图弄清楚如何在以下情况下使用Java8流:

假设我有以下地图:

Map<String,String[]> map = { { "01": {"H01","H02","H03"}, {"11": {"B11","B12","B13"}} };

所需的输出是:

map = { {"01": {"H02"}, {"11": {"B11"}};

我的尝试:

map.entrySet().stream() //
        .flatMap(entry -> Arrays.stream(entry.getValue()) //
        .filter(channel -> Channel.isValid(channel))
        .collect(Collectors.toMap()));

2 个答案:

答案 0 :(得分:2)

您当前的方法存在一些问题。

  1. 签名toMap()没有toMap方法,因此会出现编译错误。
  2. flatMap期望函数采用类型T并返回Stream<R>,而您尝试将地图作为返回值传递,这样也会导致编译错误
  3. 相反,你似乎想要这样的东西:

    Map<String, List<String>> resultSet = map.entrySet()
                    .stream() //
                    .flatMap(entry -> Arrays.stream(entry.getValue())
                            .filter(Channel::isValid)
                            .map(e -> new AbstractMap.SimpleEntry<>(entry.getKey(), e)))
                    .collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey,
                            Collectors.mapping(AbstractMap.SimpleEntry::getValue, 
                                   Collectors.toList())));
    

    或更简单的解决方案:

    map.entrySet()
       .stream() //
       .collect(Collectors.toMap(Map.Entry::getKey, 
                   a -> Arrays.stream(a.getValue())
                              .filter(Channel::isValid)
                              .collect(Collectors.toList())));
    

答案 1 :(得分:0)

这里提供了另一种解决问题的方法:

public static void stack2() {
    Map<String, String[]> map = new HashMap<>();
    map.put("01", new String[]{"H01", "H02", "H03"});
    map.put("11", new String[]{"B11", "B12", "B13"});

    Map<String, String[]> newMap = map.entrySet()
            .stream()
            .peek(e -> e.setValue(
                Arrays.stream(e.getValue())
                    .filter(Main::stack2Filter)
                    .toArray(String[]::new)))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    newMap.forEach((key, value) -> 
            System.out.println("key: " + key + " value " + Arrays.toString(value)));
}

public static boolean stack2Filter(String entry) {
    return entry.equals("H02") || entry.equals("B11");
}