我有一个域类
A和我想将它们转换为聚合对象列表
提供的样本数据的期望输出如下:
我尝试了类似这样的东西:
我可以在一个流中创建一个
View
:public class View {
private String id;
private String docId;
private String name;
// constructor, getters, etc.
}
这里有一个 View
对象列表。
具有相同 id
的元素,只在一个字段 docId
(第二个属性)上有所不同,例如:
List<View> viewList = new ArrayList<>();
viewList.add(new View("1234", "ab123", "john"));
viewList.add(new View("1234", "cd456", "john"));
viewList.add(new View("1234", "ef789", "john"));
viewList.add(new View("5678", "jh987", "jack"));
viewList.add(new View("5678", "ij654", "jack"));
viewList.add(new View("5678", "kl321", "jack"));
viewList.add(new View("9876", "mn123", "ben"));
viewList.add(new View("9876", "op456", "ben"));
}
A和我想将它们转换为聚合对象列表
NewView
。
NewView
类的样子是这样的:public static class NewView {
private String id;
private String name;
private List<String> docId = new ArrayList<>();
}
提供的样本数据的期望输出如下:
{
"id": "1234",
"name": "john",
"docIds": ["ab123", "cd456", "ef789"]
},
{
"id": "5678",
"name": "jack",
"docIds": ["jh987", "ij654", "kl321"]
},
{
"id": "9876",
"name": "ben",
"docIds": ["mn123", "op456"]
}
我尝试了类似这样的东西:
Map<String, List<String>> docIdsById = viewList.stream()
.collect(groupingBy(
View::getId,
Collectors.mapping(View::getDocId, Collectors.toList())
));
Map<String, List<View>> views = viewList.stream()
.collect(groupingBy(View::getId));
List<NewView> newViewList = new ArrayList<>();
for (Map.Entry<String, List<View>> stringListEntry : views.entrySet()) {
View view = stringListEntry.getValue().get(0);
newViewList.add(new NewView(
view.getId(),
view.getName(),
docIdsById.get(stringListEntry.getKey()))
);
}
我可以在一个流中创建一个
NewView
列表吗?