gpt4 book ai didi

java stream List 到 Map>

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:38 24 4
gpt4 key购买 nike

我有 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]) 的对象列表。

下一个为每个值 map >转换为 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();

是否可以对一个流执行此操作?

最佳答案

看来您需要按数组索引零处的元素分组 Object

Collectors.groupingBy按键分组

Map<Object, List<Object[]>> map = objects.stream()
.collect(Collectors.groupingBy(o -> o[0]));

带有 null 和空检查

Map<Object, List<Object[]>> map = objects.stream()
.filter(o -> o != null && o.length != 0)
.collect(Collectors.groupingBy(o -> o[0]));

例子

List<Object[]> objects = new ArrayList<>();
objects.add(new Object[] { 0, 1, 2, 3, 4, 5 });
objects.add(new Object[] { 1, 1, 2, 3, 4, 5 });
objects.add(new Object[] { 2, 1, 2, 3, 4, 5 });
objects.add(new Object[] { 0, 6, 7, 8, 9 });

Map<Object, List<Object[]>> map = objects.stream()
.collect(Collectors.groupingBy(o -> o[0]));

System.out.println(map);

输出是这样的

{
0 = [[Ljava.lang.Object;@378bf509,
[Ljava.lang.Object;@5fd0d5ae],
1 = [[Ljava.lang.Object;@2d98a335],
2 = [[Ljava.lang.Object;@16b98e56]
}

可以看到0有两个List<Object[]>值分组依据

关于java stream List<Object[]> 到 Map<Object, List<Object[]>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com