我对使用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>
。我曾尝试为此使用平面图,但无法正常工作,并正在寻找一些指导。
谢谢。
答案 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
返回列表。