Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在集合中展平集合以获得单个列表<&燃气轮机;_Java_List_Lambda_Java 8_Java Stream - Fatal编程技术网

Java 在集合中展平集合以获得单个列表<&燃气轮机;

Java 在集合中展平集合以获得单个列表<&燃气轮机;,java,list,lambda,java-8,java-stream,Java,List,Lambda,Java 8,Java Stream,我对使用Java非常陌生,并尝试使用map将集合中的集合展平,以获取单个列表。然而,我似乎无法让它工作。为了重现这一点,我创建了一个非常简单的例子来说明我正在尝试做的事情。以下是我到目前为止的情况: ClassA import java.util.List; public class ClassA { private List<ClassB> listOfClassB; public ClassA(List<ClassB> listOfClassB)

我对使用Java非常陌生,并尝试使用map将集合中的集合展平,以获取单个列表。然而,我似乎无法让它工作。为了重现这一点,我创建了一个非常简单的例子来说明我正在尝试做的事情。以下是我到目前为止的情况:

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

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());
    }
}
公共类主{
公共静态void main(字符串[]args){
B类第一类=新B类(“A”);
类别B第二类=新类别B(“B”);
B类第三类=新B类(“C”);
类别B第四类=新类别B(“D”);
ArrayList firstClassList=新建ArrayList();
ArrayList secondClassList=新建ArrayList();
firstClassList.add(firstClass);
第一类列表。添加(第二类);
添加(第三类);
第二类列表。添加(第四类);
ArrayList类=新的ArrayList();
添加(新的ClassA(firstClassList));
添加(新类A(第二类列表));
List collect=classes.stream().map(c->c.getListOfClassB().stream().map(ClassB::getItem).collect(Collectors.toList()).collect(Collectors.toList());
}
}
正如您在底部看到的,我可以得到
列表
,但我希望得到的是类B中项目的
列表
。我试着用平面图来做这件事,但我无法让它工作,我正在寻找一些指导


提前感谢。

下面是一个工作正常的平面地图示例:

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());

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

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

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

对于
.map
的方法参考将更加清晰:)谢谢!我没有在平面图中包括.stream()
collect2 : [A, B, C, D]
List<String> listB = classes.stream().flatMap(a-> a.getListOfClassB().stream())
                            .map(ClassB::getItem)
                            .collect(Collectors.toList());