我试图弄清楚如何在以下情况下使用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()));
答案 0 :(得分:2)
您当前的方法存在一些问题。
toMap()
没有toMap方法,因此会出现编译错误。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())));
答案 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");
}