我试图弄清楚在以下情况下如何使用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()));

最佳答案

您当前的方法存在两个问题。


没有带有签名toMap()toMap方法,因此将出现编译错误。
flatMap期望函数采用类型T并返回Stream<R>,而您试图将映射作为返回值传递,这样也会导致编译错误。


相反,您似乎想要这样的东西:

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

10-06 06:01