Java 8 - 流转换地图的值类型

时间:2017-06-14 07:34:57

标签: java

我想将List<A>类型转换为List<B>。我可以用java 8流方法吗?

    Map< String, List<B>> bMap = aMap.entrySet().stream().map( entry -> {
        List<B> BList = new ArrayList<B>();
        List<A> sList = entry.getValue();
        // convert A to B
        return ???; Map( entry.getKey(), BList) need to return
    }).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

我尝试使用此代码,但无法在map()中进行转换。

3 个答案:

答案 0 :(得分:7)

如果我理解正确,您有一个Map<String, List<A>>,并且您希望将其转换为Map<String, List<B>>。你可以这样做:

Map<String, List<B>> result = aMap.entrySet().stream()
    .collect(Collectors.toMap(
        entry -> entry.getKey(),                        // Preserve key
        entry -> entry.getValue().stream()              // Take all values
                     .map(aItem -> mapToBItem(aItem))   // map to B type
                     .collect(Collectors.toList())      // collect as list
        );

答案 1 :(得分:2)

您可以在AbstractMap.simpleEntry函数中实例化map并执行转换。

E.g。以下代码将List<Integer>转换为List<String>

Map<String, List<Integer>> map = new HashMap<>();
Map<String, List<String>> transformedMap = map.entrySet()
    .stream()
    .map(e -> new AbstractMap.SimpleEntry<String, List<String>>(e.getKey(), e.getValue().stream().map(en -> String.valueOf(en)).collect(Collectors.toList())))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

答案 2 :(得分:1)

你可以这样做:

public class Sandbox {

    public static void main(String[] args) {
        Map<String, List<A>> aMap = null;
        Map<String, List<B>> bMap = aMap.entrySet().stream().collect(toMap(
                Map.Entry::getKey,
                entry -> entry.getValue().stream()
                        .map(Sandbox::toB)
                        .collect(toList())));
    }

    private static B toB(A a) {
        // add your conversion
        return null;
    }

    class B {}

    class A {}
}