怎么使用java8的stream合并HashMap的所有value为一个List,value的类型为Stack

廖湘浩
  • 130

怎么使用java8的stream合并HashMap的所有value为一个List,value的类型为Stack
map = new HashMap<String, Stack<String>>;
要求把map的value合并成List<String>,并使用java8的stream方法操作
Stack是java自带的容器,在这里完全可以看成是ArrayList

回复
阅读 21.4k
3 个回答
✓ 已被采纳

在写stream的时候,一定要心里非常清楚当前stream中到底是什么元素,这样你才能结合map,filter,peek等方法来转化你的数据

首先开始的时候还没有stream,数据源是一个map,把map转化为stream,我还是建议使用entryset的方式

// 此时stream里的元素是Map.Entry<String, Stack<String>>
map.entrySet().stream()

题主是想要Entry里面的value,也就是Stack<String>,那就要把Map.Entry<String, Stack<String>>转化为Stack<String>,那这里肯定要用map操作啦

// 此时stream里的元素是Stack<String>
map.entrySet().stream().map(Map.Entry::getValue)

拿到了Stack<String>stream还不够,看题主的意思,是想取出Stack中的一个String的属性或者一个计算出来的值,那就是要把Stack转化为String,根据题主的信息,这个Stack其实就是java.util.Stack,那这个也相当于是一个集合了,集合都会有都可以变成stream的,由于需要集合里的string对象,那就相当于要把这个Stack集合压平,压平的话,那就肯定要用flatmap

List<String> collect = map.entrySet().stream()
                                     .map(Map.Entry::getValue)
                                     .flatmap(Stack::stream)
                                     .collect(Collectors.toList());

这样就完整啦,当然map中我用的是方法引用,觉得这么写更直观一点,可以看得到当前stream里到底是啥类型元素,你也可以写成lamdba的形式啦

map.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList())
Ronrey
  • 2
新手上路,请多包涵

[{

"name1":"test1",
"age1":"90"

},{

"name2":"test2",
"age2":"23"

},{

"name3":"test3",
"age3":"79"

}]

请问下有一个这样的JSON或MAP,如何转换成:
List<User> userList = new ArrayList();
user.name = ...
user.age = ...

宣传栏