【发布时间】:2018-03-05 21:19:32
【问题描述】:
我有两个对象,如下所示:
public class A {
private Integer id;
private String name;
private List<B> list;
public A(Integer id, String name, List<B> list) {
this.id = id;
this.name = name;
this.list = list;
}
//getters and setters
}
和
public class B {
private Integer id;
private String name;
public B(Integer id, String name) {
this.id = id;
this.name = name;
}
//getters and setters
}
所以,A 持有 B 的列表,并且 A 的列表填充如下:
List<A> list = new ArrayList<>();
list.add(new A(1, "a_one", Arrays.asList(new B(1, "b_one"), new B(2, "b_two"))));
list.add(new A(2, "a_two", Arrays.asList(new B(2, "b_two"))));
list.add(new A(1, "a_one", Arrays.asList(new B(3, "b_three"))));
list.add(new A(2, "a_two", Arrays.asList(new B(4, "b_four"), new B(5, "b_five"))));
list.add(new A(3, "a_three", Arrays.asList(new B(4, "b_four"), new B(5, "b_five"))));
我想通过合并具有相同 id 的 A 对象来获取一个新列表。结果列表必须是这样的:
[
A(1, a_one, [B(1, b_one), B(2, b_two), B(3, b_three)]),
A(2, a_two, [B(2, b_two), B(4, b_four), B(5, b_five)]),
A(3, a_three, [B(4, b_four), B(5, b_five)])
]
我确实设法将列表与以下代码合并:
List<A> resultList = new ArrayList<>();
list.forEach(a -> {
if (resultList.stream().noneMatch(ai -> ai.getId().equals(a.getId()))) {
a.setList(list.stream().filter(ai -> ai.getId().equals(a.getId()))
.flatMap(ai -> ai.getList().stream()).collect(Collectors.toList()));
resultList.add(a);
}
});
我的问题是,有没有合适的方法通过使用流收集器来做到这一点?
【问题讨论】:
-
应该有正确的方法
标签: java java-8 java-stream collectors