gpt4 book ai didi

Java 8 按公共(public)子对象对对象进行分组

转载 作者:行者123 更新时间:2023-12-02 11:49:09 25 4
gpt4 key购买 nike

假设我有一个来自数据库的对象列表,格式如下

public class DBEvent {
private String guiEventId;
private String guiEventColor;
private int questionId;
private Date date;
// + Getters/setters...
}

List<DBEvent>包含以下内容,其中重复了一些表格数据。我需要按相同的 GuiEventId/GuiEventColor 对所有条目进行分组,并拆分不同的 QuestionId/Date。这可以是一个新的对象列表。

enter image description here

目标:

public class NewEvent {
private String guiEventId;
private String guiEventColor;
private Date date1;
private Date date2;
}

换句话说,我需要捕获不同的日期(每对的第 1/2 行),同时保持其余信息相同,并将其作为对象。

Java 8 有一些流/过滤功能,它们在这里有帮助吗?或者我是否需要访问数据库并重构我的 SQL 查询?

最佳答案

您可以根据从集合元素计算出的值对项目进行分组。例如,要按 guiEventId 对事件进行分组,您可以调用:

List<DBEvent> events = ...//get events
Map<String, List<DBEvent>> groupedEvents =
events.stream().collect(Collectors.groupingBy(event -> event.getGuiEventId()));

这会生成一个映射,其中所有遇到的事件 ID 都映射到相应事件对象的列表。如果您确定事件 ID 和颜色成对一致,则在分组键中包含颜色是多余的(尽管这很容易更改)。

现在,对于给定的事件对组,您要做的是将任何 2 元素列表的列表转换为单个元素。为此,您可以将值列表转换为新类型的事件:

//define a function that takes a list of events and produces a new event:
private NewEvent createNewEvent(List<DBEvent> events) {
NewEvent evt = new NewEvent();
evt.setGuiEventId(events.get(0).getGuiEventId());
evt.setGuiEventColor(events.get(0).getGuiEventColor());
evt.setDate1(events.get(0).getDate());
evt.setDate2(events.get(1).getDate());

return evt;
}

现在您可以将数据库事件列表映射的值集合中的值映射到 NewEvent:

List<NewEvent> newEvents = 
groupedEvents.values().stream().map(eventList -> createNewEvent(eventList))
.collect(Collectors.toList());

应注意以下几点:

  • 我假设对于任何给定的 ID,您都将不可避免地获得一对事件。如果不能保证这一点,您可能需要验证或更改逻辑以避免错误或索引越界错误
  • 如果每个事件 ID 有多个条目,则必须使用 Stream.reduce 来执行成对合并到新事件中(但随后您必须执行以下操作)分两步进行,因为reduce 会产生相同的类型)

关于Java 8 按公共(public)子对象对对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998505/

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