Java 8 流转换和列表

Java 8 streams transformations and List

提问人:AntonBoarf 提问时间:10/31/2018 更新时间:10/31/2018 访问量:194

问:

我有一个:

Map<String,List<String>> persons

而 中的每个元素都代表一个StringList<String>Long

所以我想把我变成一个Map<String,List<String>>Map<String,List<Long>>

问题是我的列表被封装到地图中。我知道使用单个列表,我可以做到这一点:

list.stream().map(s -> Long.valueOf(s)).collect(Collectors.toList());

但我的情况有点不同。知道如何进行吗?

谢谢

java-8 java-stream

评论


答:

3赞 Eugene 10/31/2018 #1
 Map<String,List<String>> persons = ...

 Map<String, List<Long>> result = new HashMap<>();

 persons.forEach((key, value) -> {
        result.put(key, value.stream().map(Long::valueOf).collect(Collectors.toList()));
 });

评论

0赞 Naman 10/31/2018
为什么不简单地收集toMap呢?
0赞 Eugene 10/31/2018
@nullpointer因为另一个答案已经这样做了,我猜
0赞 Naman 10/31/2018
哦,这样一来,我几乎想到了将两个收集器调用与一种类型的比较进行比较:)我的坏..
2赞 Holger 10/31/2018
这里不需要语句语法,即您可以删除大括号和一个分号......
4赞 davidxxx 10/31/2018 #2

您可以使用此集合:

list.stream().map(s -> Long.valueOf(s)).collect(Collectors.toList());

作为应用于地图流的参数。valueMappertoMap()

这将给出:

import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;

Map<String,List<String>> persons = ...;
Map<String,List<Long>> personsMapped = 
persons.entrySet()
       .stream()
       .collect(toMap(Entry::getKey, e -> e.getValue().stream()
                                                      .map(Long::valueOf)
                                                      .collect(toList()))
               );
1赞 Ravindra Ranwala 10/31/2018 #3

你可以这样做,

Map<String, List<Long>> longMap = persons.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey,
        e -> e.getValue().stream().map(s -> Long.valueOf(s)).collect(Collectors.toList())));