【问题标题】:Flattening a collection within collection to get a single List<>展平集合内的集合以获得单个 List<>
【发布时间】:2018-10-28 17:29:06
【问题描述】:

我对使用 Java 还是很陌生,并试图使用 map 来扁平化集合中的集合以尝试获取单个列表。但是我似乎无法让这个工作。为了重现这一点,我创建了一个非常简单的示例来说明我正在尝试做的事情。这是我到目前为止所拥有的:

A 类

import java.util.List;

public class ClassA {
    private List<ClassB> listOfClassB;

    public ClassA(List<ClassB> listOfClassB) {
        this.listOfClassB = listOfClassB;
    }

    public List<ClassB> getListOfClassB() {
        return this.listOfClassB;
    }
}

B 类

    public class ClassB {
    private String item;

    public ClassB(String item) {
        this.item = item;
    }

    public String getItem() {
        return item;
    }
}

主要

public class Main {
    public static void main(String[] args) {
        ClassB firstClass = new ClassB("A");
        ClassB secondClass = new ClassB("B");
        ClassB thirdClass = new ClassB("C");
        ClassB fourthClass = new ClassB("D");
        ArrayList<ClassB> firstClassList = new ArrayList<>();
        ArrayList<ClassB> secondClassList = new ArrayList<>();

        firstClassList.add(firstClass);
        firstClassList.add(secondClass);
        secondClassList.add(thirdClass);
        secondClassList.add(fourthClass);

        ArrayList<ClassA> classes = new ArrayList<>();
        classes.add(new ClassA(firstClassList));
        classes.add(new ClassA(secondClassList));

        List<List<String>> collect = classes.stream().map(c -> c.getListOfClassB().stream().map(ClassB::getItem).collect(Collectors.toList())).collect(Collectors.toList());
    }
}

正如您在底部看到的那样,我可以得到List&lt;List&lt;String&gt;&gt;,但我希望得到的是ClassB 中的List&lt;String&gt;。我已尝试为此使用平面地图,但无法使其正常工作,正在寻找一些指导。

提前致谢。

【问题讨论】:

    标签: java list lambda java-8 java-stream


    【解决方案1】:

    以下是可以正常工作的平面地图示例:

    classes.stream().flatMap(aclass -> aclass.getListOfClassB().stream())
        .forEach(b -> System.out.println("Class B Item Name : "+b.getItem()));
    

    它给出以下输出:

    Class B Item Name : A
    Class B Item Name : B
    Class B Item Name : C
    Class B Item Name : D
    

    并得到准确的答案:

    List<String> collect2 = classes.stream().flatMap(aclass -> aclass.getListOfClassB().stream())
        .map(b -> b.getItem())
        .collect(Collectors.toList());
    

    它给了我一个如下列表:

    collect2 : [A, B, C, D]
    

    【讨论】:

    • .map 的方法参考会更简洁:)
    【解决方案2】:

    这将返回ClassB字符串 列表:

    List<String> listB = classes.stream().flatMap(a-> a.getListOfClassB().stream())
                                .map(ClassB::getItem)
                                .collect(Collectors.toList());
    

    这里,我们使用flatMap,然后映射ClassBgetItem,最后使用.collect(...)返回列表。

    【讨论】:

    • 谢谢!我没有在平面图中包含 .stream()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多