Java streams,基于两个不同的对象创建新对象

Java streams,基于两个不同的对象创建新对象,java,lambda,java-stream,Java,Lambda,Java Stream,基于两个不同对象创建新对象的最佳方法是什么 我想使用java流 我的两个开始对象 public class EventA{ Long id; String name; ... Long locationID; } public class EventB{ Long id String Name; ... Long locationID; } 我的成绩如何 public class Result{ Long locatio

基于两个不同对象创建新对象的最佳方法是什么

我想使用java流

我的两个开始对象

public class EventA{
    Long id;
    String name;
    ...
    Long locationID;
}

public class EventB{
    Long id
    String Name;
    ...
    Long locationID;
}
我的成绩如何

public class Result{
    Long locationID;
    String eventAName;
    String eventBName;

    public Result(...){...}
}
我有两个对象数组,比如

List<EventA> eventAList;
List<EventB> eventBList;
我想得到一个结果对象数组。每个事件名称都应复制到结果列表中。如果同一位置存在EventB,我想将该名称保存在EventB名称中

到目前为止,我所做的只是

List<Result> resultList = eventAList.stream().map(e -> new Result(e.locationID, e.name, null)).collect(Collectors.toList());
我不知道如何将值从EventB传递给构造函数创建结果时,可以使用流在eventBList中迭代值,只保留与EventList值具有相同locationID的值,然后获取找到的值,并将其映射到其名称值,如果不存在,则为null:

List<Result> resultList = eventAList.stream().map(a -> new Result(a.locationID, a.name,
    eventBList.stream().filter(b -> b.locationID.equals(a.locationID)).findAny().map(b -> b.Name).orElse(null)
)).collect(Collectors.toList());
创建结果时,您可以使用流对eventBList中的值进行迭代,以仅保留与EventList值具有相同locationID的值,然后获取找到的值,并将其映射到其名称值,如果不存在,则映射为null:

List<Result> resultList = eventAList.stream().map(a -> new Result(a.locationID, a.name,
    eventBList.stream().filter(b -> b.locationID.equals(a.locationID)).findAny().map(b -> b.Name).orElse(null)
)).collect(Collectors.toList());
我找到了一个工作方法

我将结果类的构造函数调整为

然后在我的java流中

List<Result> resultList = eventAList.stream().map(ea -> new Result(ea.locationID, ea.name, eventBList.stream().filter(eb -> eb.locationID.equals(ea.locationID)).findFirst().orElse(new EventB()).get()).collect(Collectors.toList());
我找到了一个工作方法

我将结果类的构造函数调整为

然后在我的java流中

List<Result> resultList = eventAList.stream().map(ea -> new Result(ea.locationID, ea.name, eventBList.stream().filter(eb -> eb.locationID.equals(ea.locationID)).findFirst().orElse(new EventB()).get()).collect(Collectors.toList());

您可以执行以下操作,然后进行增强,例如,通过locationId作为键为eventBlist创建一个映射,以便进行更快的搜索

Function<EventA, SimpleEntry<EventA, Optional<EventB>>> mapToSimpleEntry = eventA -> new SimpleEntry<>(eventA,
    eventBList.stream()
    .filter(e -> Objects.equals(e.getLocationID(), eventA.getLocationID()))
    .findFirst());

Function<SimpleEntry<EventA, Optional<EventB>>, Result> mapToResult = simpleEntry -> {
    EventA eventA = simpleEntry.getKey();
    Optional<EventB> eventB = simpleEntry.getValue();
    return new Result(eventA.getLocationID(), eventA.getName(), eventB.map(EventB::getName).orElse(null));
};

eventAList.stream()
    .map(mapToSimpleEntry)
    .map(mapToResult)
    .collect(Collectors.toList());

您可以执行以下操作,然后进行增强,例如,通过locationId作为键为eventBlist创建一个映射,以便进行更快的搜索

Function<EventA, SimpleEntry<EventA, Optional<EventB>>> mapToSimpleEntry = eventA -> new SimpleEntry<>(eventA,
    eventBList.stream()
    .filter(e -> Objects.equals(e.getLocationID(), eventA.getLocationID()))
    .findFirst());

Function<SimpleEntry<EventA, Optional<EventB>>, Result> mapToResult = simpleEntry -> {
    EventA eventA = simpleEntry.getKey();
    Optional<EventB> eventB = simpleEntry.getValue();
    return new Result(eventA.getLocationID(), eventA.getName(), eventB.map(EventB::getName).orElse(null));
};

eventAList.stream()
    .map(mapToSimpleEntry)
    .map(mapToResult)
    .collect(Collectors.toList());

EventA和EventB不能有一个共同的祖先,因为它们显示几乎相同的属性吗?然后你会有一个列表流…不,这只是为了简化我的例子。事实上,它们是完全不同的。你说的在同一地点是什么意思?EventList和eventBList?resultList中的相同位置ID或相同索引应与EventList一样大。如果位置与相同的locationID匹配,我希望将EventB的名称保存在结果对象的eventBName中。由于EventA和EventB显示的属性几乎相同,您不能只拥有一个共同的祖先吗?然后你会有一个列表流…不,这只是为了简化我的例子。事实上,它们是完全不同的。你说的在同一地点是什么意思?EventList和eventBList?resultList中的相同位置ID或相同索引应与EventList一样大。如果位置与相同的locationID匹配,我希望将EventB的名称保存在结果对象的eventBName中。