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

Ser*_*uss 4 java lambda list 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

ClassB的

    public class ClassB {
    private String item;

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

    public String getItem() {
        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

主要

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你在底部看到的那样,我能够得到List<List<String>>但是我想要得到的是List<String>ClassB中的一个项目.我尝试过使用平面图,但是我无法使用它,并且正在寻找一些指导.

提前致谢.

Kay*_*ayV 7

这是flatmap示例,它可以正常工作:

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

它给出了以下输出:

Class B Item Name : A
Class B Item Name : B
Class B Item Name : C
Class B Item Name : D
Run Code Online (Sandbox Code Playgroud)

并得到确切的答案:

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

它给我一个列表如下:

collect2 : [A, B, C, D]
Run Code Online (Sandbox Code Playgroud)


Nic*_*s K 5

这将返回以下字符串列表ClassB

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

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