从列表<对象>映射映射<对象、列表<整数>>属于共同财产的

发布于 2025-01-12 21:13:16 字数 2288 浏览 2 评论 0 原文

我有以下事件对象定义:

@Data
class Event{
    private int referenceId;
    private int messageId;
    private String comment;

    public Event(int referenceId, int messageId, String comment) {
        this.referenceId = referenceId;
        this.messageId = messageId;
        this.comment = comment;
    }
}

我得到以下输入:

EventDTO event  = new Event(1, 1, "comment");
EventDTO event1 = new Event(1, 2, "comment");
EventDTO event3 = new Event(1, 3, "comment");
EventDTO event4 = new Event(1, 4, "comment");

List<EventDTO> events = List.of(event, event1, event3, event4);

除了 messageId 属性之外,我拥有的所有输入都将具有相同的数据。 由于我需要将这些数据转换为另一个名为 EventMessages 的对象:

@Data
class ChangeReason{
    private int id;
    private String description;

    public ChangeReason(int id, String description) {
        this.id = id;
        this.description = description;
    }
}


@Data
class EventMessages{
    private int referenceId;
    private String comment;
    private List<ChangeReason> reasons;

    public EventMessages(int referenceId, String comment, List<ChangeReason> reasons) {
        this.referenceId = referenceId;
        this.comment = comment;
        this.reasons = reasons;
    }
}

ChangeReason id 是 Event 类的 messageId

问题是 Event 的 N 个对象需要映射到只是1 个 EventMessages 对象。我确信传入事件中的所有属性都与 messageId 的预期相同。

我不太喜欢像这样获取第一个对象的解决方案:

List<ChangeReason> reasons = events.stream().map(event -> new ChangeReason(event.getMessageId(), "")).collect(Collectors.toList());
EventMessages eventMessages = new EventMessages(events.get(0).getReferenceId(), events.get(0).getComment(), reasons);

我不太喜欢这个实现,我想知道是否有更好的方法来实现这一点。

我试图获得以下数据结构场景: 地图<活动、列表<整数> > eventsWithMessages

因此,关键事件将是来自的对象,我将检索所有对象中常见的注释和referenceId信息,该值将是收集的事件列表的不同messageId列表我正在尝试使用lambdas来获取它和流

这样做是行不通的:

        Map<Event, List<Integer>> eventMessages = events.stream().collect
            (Collectors.groupingBy(e -> e, Collectors.mapping(e -> e.getMessageId(), Collectors.toList())));

由于 groupingBy 键比较是由对象完成的,并且 messageId 的属性不同......

I have the following Event object definition:

@Data
class Event{
    private int referenceId;
    private int messageId;
    private String comment;

    public Event(int referenceId, int messageId, String comment) {
        this.referenceId = referenceId;
        this.messageId = messageId;
        this.comment = comment;
    }
}

I am given the following input:

EventDTO event  = new Event(1, 1, "comment");
EventDTO event1 = new Event(1, 2, "comment");
EventDTO event3 = new Event(1, 3, "comment");
EventDTO event4 = new Event(1, 4, "comment");

List<EventDTO> events = List.of(event, event1, event3, event4);

All the input I have will have the same data except the messageId property.
Since I need to transform this data into another object called EventMessages:

@Data
class ChangeReason{
    private int id;
    private String description;

    public ChangeReason(int id, String description) {
        this.id = id;
        this.description = description;
    }
}


@Data
class EventMessages{
    private int referenceId;
    private String comment;
    private List<ChangeReason> reasons;

    public EventMessages(int referenceId, String comment, List<ChangeReason> reasons) {
        this.referenceId = referenceId;
        this.comment = comment;
        this.reasons = reasons;
    }
}

The ChangeReason id is the messageId of Event class

The problem is that N objects of Event need to be mapped into just 1 object of EventMessages. I am sure that all properties among incoming Events are going to be the same expect for the messageId.

I do not really like the solution of getting the first object like this:

List<ChangeReason> reasons = events.stream().map(event -> new ChangeReason(event.getMessageId(), "")).collect(Collectors.toList());
EventMessages eventMessages = new EventMessages(events.get(0).getReferenceId(), events.get(0).getComment(), reasons);

I dont really like this implementation and i was wondering if there is a better way of achiveing this.

I am trying to get the following scenario of data structure:
Map<Event,List< Integer> > eventsWithMessages

So the key Event will be the object from I will retreive the comment and referenceId information which is common among all objects and the value would be the Collected different List of messageIds of events List I am trying to get this using lambdas and streams

Doing this wouldn't work:

        Map<Event, List<Integer>> eventMessages = events.stream().collect
            (Collectors.groupingBy(e -> e, Collectors.mapping(e -> e.getMessageId(), Collectors.toList())));

Since the groupingBy key comparison is done by the object and the property of messageId is different...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恰似旧人归 2025-01-19 21:13:16

找到了解决方案。我开始使用 mergeOperators,我认为这可能是我过去遇到的这个问题的解决方案。我留下代码:

首先我需要为 Event 类实现 EqualHashCode:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Event)) return false;
        Event event = (Event) o;
        return getReferenceId() == event.getReferenceId() && getComment().equals(event.getComment());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getReferenceId(), getComment());
    }

然后我在 MergeFunction toMap() 上使用了此代码

    Map<Event, List<Integer>> eventsWithMessages = events.stream()
            .collect(Collectors.toMap(
                    event -> event,
                    event -> Collections.singletonList(event.getMessageId()), 
                    (list1, list2) -> { // Here is the magic
                        List<Integer> mergedList = new ArrayList<>(list1);
                        mergedList.addAll(list2);
                        return mergedList;
                    }
            ));

Found a solution. I started working with mergeOperators and I thought this could be the solution for this problem I had in the past. I leave the code:

First I needed to implement an EqualHashCode for the Event class:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Event)) return false;
        Event event = (Event) o;
        return getReferenceId() == event.getReferenceId() && getComment().equals(event.getComment());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getReferenceId(), getComment());
    }

Then i used this code on MergeFunction toMap()

    Map<Event, List<Integer>> eventsWithMessages = events.stream()
            .collect(Collectors.toMap(
                    event -> event,
                    event -> Collections.singletonList(event.getMessageId()), 
                    (list1, list2) -> { // Here is the magic
                        List<Integer> mergedList = new ArrayList<>(list1);
                        mergedList.addAll(list2);
                        return mergedList;
                    }
            ));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文