转换地图<;字符串,NavigableMap<;长,收集<;字符串>&燃气轮机&燃气轮机;列出<;字符串>;使用Java8
我正在尝试将转换地图<;字符串,NavigableMap<;长,收集<;字符串>&燃气轮机&燃气轮机;列出<;字符串>;使用Java8,java,java-8,Java,Java 8,我正在尝试将Map转换为ListJava8 我写了一些代码,但中途有些地方卡住了 userTopics.values().stream().map( new Function<NavigableMap<Long, Collection<String>>, Collection<String>>() { @Override public Collection<String> apply(Naviga
Map
转换为List
Java8
我写了一些代码,但中途有些地方卡住了
userTopics.values().stream().map(
new Function<NavigableMap<Long, Collection<String>>, Collection<String>>() {
@Override
public Collection<String> apply(NavigableMap<Long, Collection<String>> t) {
return null; //TODO
}
}
);
userTopics.values().stream().map(
新函数(){
@凌驾
公开募捐申请(NavigableMap t){
返回null;//TODO
}
}
);
只需:
List values=nestedMap.entrySet()
.stream()
.map(map.Entry::getValue)
.flatMap(m->m.entrySet().stream())
.map(map.Entry::getValue)
.flatMap(集合::流)
.collect(toList());
正如所指出的,这更为整洁:
List<String> values = nestedMap.values()
.stream()
.flatMap(m -> m.values().stream())
.flatMap(Collection::stream)
.collect(toList());
List values=nestedMap.values()
.stream()
.flatMap(m->m.values().stream())
.flatMap(集合::流)
.collect(toList());
两个flatmap
就可以了,先展平NavigableMap
,然后展平集合
内部
List<String> result = mapOfMaps.values()
.stream()
.flatMap(v -> v.values().stream())
.flatMap(Collection::stream)
.collect(Collectors.toList());
List result=mapOfMaps.values()
.stream()
.flatMap(v->v.values().stream())
.flatMap(集合::流)
.collect(Collectors.toList());
一个有趣的反模式,甚至两次entrySet().stream().map(map.Entry::getValue)
而不是首先在所需项目上进行流式处理:values().stream()
@cody123:它与.map(Entry->Entry.getValue())
相同,其中Entry
的类型为map.Entry
。当您在中间流操作中也需要键时,通过entrySet().stream()
对条目进行流式处理并在需要值流时映射到值是正确的解决方案。但是,当您只需要这些值时,您可以首先对这些值进行右流处理。
List<String> result = mapOfMaps.values()
.stream()
.flatMap(v -> v.values().stream())
.flatMap(Collection::stream)
.collect(Collectors.toList());