我有List<Object[]>
内连接 MySQL查询,我需要创建地图键 id 和值对象
以下代码有效,但如何最好地使用 Streams ?
Map<Object, List<Object[]>> convert(List<Object[]> objects) {
Map<Object, List<Object[]>> objectListMap = objects.stream()
.collect(Collectors.toMap(obj -> obj[0], obj -> {
List<Object[]> list = new ArrayList<>();
list.add(obj);
return list;
}, (obj1, obj2) -> {
obj1.addAll(obj2);
return obj1;
}));
return objectListMap;
}
Object[] objects structure:
objects[0] = person id
...
objects[10] = event id
...
objects[15] = event name
此查询找到所有访问过该事件的人,但是对象数组中从0到10的索引可能相同,11-15总是更改。
我想合并所有具有相同id的对象列表(objects [0])。
下一个每个值 地图&gt; 转换为POJO:
PersonWithEvent converToEntity(List<Object[]> objects) {
Optional< PersonWithEvent > personWithEvent =
objects.stream()
.findFirst().map(obj -> {
PersonWithEvent p = new PersonWithEvent();
p.setId((Integer) obj[0]);
...
return p;
});
personWithEvent.ifPresent(p -> {
List<PersonEvent> personEvents = objects.stream()
.map(obj -> {
PersonEvent pe = new PersonEvent();
pe.setName((String) obj[2]);
...
return pe;
})
.collect(Collectors.toList());
p.setPersonEvents(personEvents);
});
return personWithEvent.get();
是否有可能为一个流做到这一点?
答案 0 :(得分:0)
我会让整个过程更加明确和清晰。使用具有大量注释和良好变量名称的混合样式。
在阅读,理解和维护代码时,这应该会有很多帮助。
Map<Object, List<Object[]>> convert(List<Object[]> entities) {
Map<Object, List<Object[]>> idToEntitesWithSameId = new HashMap<>();
entities.forEach(entity -> {
// Create an entry for each entity,
// merge with entities of same id
Object id = entity[0];
// Get current value or empty list
List<Object[]> entitiesWithId = idToEntitesWithSameId
.computeIfAbsent(id, ArrayList::new);
// Add own entity, merge with other
// entities of same id
Arrays.stream(entity).forEach(entitiesWithId::add);
});
return idToEntitesWithSameId;
}