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