Java 8:将具有字符串值的映射转换为包含不同类型的列表

zhu*_*wei 4 java java-8 java-stream map-function

我有这个Map:

Map<Integer, Set<String>> map = ...
Run Code Online (Sandbox Code Playgroud)

我有这堂课Foo:

class Foo {
    int id;
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我想将地图转换为List<Foo>.在Java 8中有一种方便的方式来做到这一点吗?

目前,我的方式是:

List<Foo> list = new ArrayList<>((int) map.values().flatMap(e->e.stream()).count()));

for(Integer id : map.keySet()){
    for(String name : map.get(id)){
        Foo foo = new Foo(id,name);
        list.add(foo);  
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得这太麻烦了.

Tun*_*aki 6

您可以拥有以下内容:

List<Foo> list = map.entrySet()
                    .stream()
                    .flatMap(e -> e.getValue().stream().map(name -> new Foo(e.getKey(), name)))
                    .collect(toList());
Run Code Online (Sandbox Code Playgroud)

对于地图的每个条目,我们创建一个值的Stream并将其映射到相应的Foo,然后使用它来展平它flatMap.