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