Java 8 流转换和列表

4

我有一个:

Map<String,List<String>> persons

每个List<String>中的String元素表示一个Long

因此,我想将我的Map<String,List<String>>转换为Map<String,List<Long>>

问题是我的列表封装在一个映射中。我知道对于单个列表,我可以这样做:

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

但是我的情况有些不同。有什么想法如何继续吗?谢谢。
3个回答

4
你可以使用这个集合:
list.stream().map(s -> Long.valueOf(s)).collect(Collectors.toList());

作为应用于map流的toMap()方法的valueMapper参数。这将会给出:
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()))
               );

3
 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()));
 });

为什么不直接收集到Map中呢? - Naman
因为其他答案已经这样做了,所以@nullpointer我猜也是这么想的。 - Eugene
哦,这样啊,我差点就想到比较两个收集器调用和一种类型的比较了:) 我错了.. - Naman
2
不需要语句的语法,即可以删除花括号和一个分号... - Holger

1
你可以这样做,

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())));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接