展平集合中的集合以获得单个List <>

时间:2018-10-28 17:29:06

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

我对使用Java很陌生,并尝试使用map展平集合中的集合,以尝试获取单个List。但是,我似乎无法正常工作。为了重现这一点,我创建了一个非常简单的示例来说明我要做什么。这是我到目前为止的内容:

ClassA

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;
    }
}

ClassB

    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<List<String>>,但我想要得到的是{B}中的List<String>。我曾尝试为此使用平面图,但无法正常工作,并正在寻找一些指导。

谢谢。

2 个答案:

答案 0 :(得分:7)

以下是效果很好的平面图示例:

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]

答案 1 :(得分:4)

这将返回ClassB字符串的列表:

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

在这里,我们使用flatMap,然后映射getItem的{​​{1}},最后使用ClassB返回列表。