Java 8:在同一个流中映射类的多个属性



你好,我的问题与Java8非常相似:流映射同一流中的两个属性,但由于某些原因,我无法使代码正常工作。

就像这个问题一样,假设我有一个类Model

class Model {
private List<Integer> listA;
private List<Integer> listB;
private List<Integer> listC;
public List<Integer> getListA() {
return listA;
}
public List<Integer> getListB() {
return listB;
}
public List<Integer> getListC() {
return listC;
}
}

因此,我想使用流将List<Model> myList中的这些列表组合起来,我的代码如下所示:

myList.stream()
.flatmap(i -> Stream.of(i.getListA(), i.getListB(), i.getListC()))
.collect(Collectors.toList())
.get(0)

但这种方法最终会返回一个空列表。我会感谢的任何建议

与链接问题的区别在于,您有三个级别:一个Model序列,每个模型都有多个属性。这些属性是Lists,因此它们也可能包含多个元素。

现在,您可以使用flatMap两次,而不是一次。

myList.stream()
.flatMap(model -> Stream.of(model.getListA(), model.getListB(), model.getListC())
.flatMap(List::stream))
.toList();

您必须用Stream.concat连接这3个列表。连接流后(不要交叉!(,将它们平面映射到Stream<Integer>,然后收集到List

myList.stream()
.flatMap(m -> Stream.concat(Stream.concat(m.getListA().stream(),
m.getListB().stream()),
m.getListC().stream()))
.collect(Collectors.toList());

List<Model> models = List.of(
new Model(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9)),
new Model(Arrays.asList(11, 12, 13), Arrays.asList(14, 15, 16), Arrays.asList(17, 18, 19)),
new Model(Arrays.asList(21, 22, 23), Arrays.asList(24, 25, 26), Arrays.asList(27, 28, 29))
);

输出为:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29]

最新更新