使用Java8流将2个不同对象的列表连接到第三个对象的列表

使用Java8流将2个不同对象的列表连接到第三个对象的列表,java,list,join,java-8,java-stream,Java,List,Join,Java 8,Java Stream,我遇到了一个我没有解决的问题;我无法解决 我有3种类型的对象 MyObject1-具有字段id和名称 MyObject2-具有字段id和错误 MyJoinObject-包含字段id、名称和错误 我有两份清单: MyObject列表1 MyObject列表2 我想创建MyJoinObject的第三个列表,它是两个列表的连接。 将有MyJoinObject对象作为MyObject1对象,但如果存在,它们也将包含错误(由id连接)。 我想用Java 8流实现这一点,您可以这样做: List<My

我遇到了一个我没有解决的问题;我无法解决

我有3种类型的对象

  • MyObject1-具有字段id和名称
  • MyObject2-具有字段id和错误
  • MyJoinObject-包含字段id、名称和错误
  • 我有两份清单:

  • MyObject列表1
  • MyObject列表2
  • 我想创建MyJoinObject的第三个列表,它是两个列表的连接。 将有MyJoinObject对象作为MyObject1对象,但如果存在,它们也将包含错误(由id连接)。
    我想用Java 8流实现这一点,您可以这样做:

    List<MyJoinObject> result = 
        list1.stream().map( o1 -> {
            Optional<MyObject2> error = list2.steam()
                                             .filter( o2 -> o2.getId() == o1.getId() )
                                             .findAny();
            if ( error.isPresent() ) 
                return new MyJoinObject( o1.getId(), o1.getName(), error.get().getError() );      
    
            return new MyJoinObject( o1.getId(), o1.getName() );
    
        } ).collect( Collectors.toList() );
    
    列表结果=
    list1.stream().map(o1->{
    可选错误=list2.steam()
    .filter(o2->o2.getId()==o1.getId())
    .findAny();
    if(error.isPresent())
    返回新的MyJoinObject(o1.getId(),o1.getName(),error.get().getError());
    返回新的MyJoinObject(o1.getId(),o1.getName());
    }).collect(Collectors.toList());
    
    您还可以通过执行以下操作来构建由id映射的错误的hasmap:

    final Map<Integer, MyObject2> errorsById = 
         list2.stream( )
              .collect( Collectors.toMap( MyObject2::getId, Function.identity( ) ) );
    
    最终映射错误bYID=
    列表2.流()
    .collect(Collectors.toMap(MyObject2::getId,Function.identity());
    

    如果您这样做,您可以通过调用方法
    containsKey()
    get()
    来使用此映射来检索错误类似的方法可以工作(尽管我没有验证):

    publicstaticvoidmain(字符串[]args){
    List object1list=new ArrayList();//用数据填充
    List object2list=new ArrayList();//用数据填充
    List joinobjectlist=新建ArrayList();
    object1list.stream().forEach(
    o1->object2list.stream().filter(
    o2->o1.getId()==o2.getId()
    ).forEach(o2->joinobjectlist.add(
    新的JoinObject(o2.getId(),o1.getName(),o2.getError())
    )
    );
    }
    
    有关您的信息:

    public static void main(String[] args) {
    
        List<MyObject1> myObject1s = new ArrayList<>();
        List<MyObject2> myObject2s = new ArrayList<>();
    
        // convert myObject2s to a map, it's convenient for the stream
        Map<Integer, MyObject2> map = myObject2s.stream().collect(Collectors.toMap(MyObject2::getId, Function.identity()));
    
        List<MyJoinObject> myJoinObjects = myObject1s.stream()
                                                     .map(myObject1 -> new MyJoinObject(myObject1, map.get(myObject1.getId()).getError()))
                                                     .collect(Collectors.toList());
    
    }
    

    就这些P

    如果你能给出一个答案,包括你迄今为止所做的尝试,那将非常有帮助。如果单个MyObject1存在多个错误,会发生什么情况?每个对象列表都包含id属性的唯一对象,因此对象可以有一个错误,也可以没有错误。Hmm。在LINQ(.NET)中,这将是微不足道的。不幸的是,我不确定Java流中的组联接是否等效。我仍然强烈鼓励你更新你的问题,让人们更容易帮助你。包括样本输入数据(硬编码)和预期输出数据。。。以及你已经尝试过的任何东西。
    public static void main(String[] args) {
    
        List<MyObject1> myObject1s = new ArrayList<>();
        List<MyObject2> myObject2s = new ArrayList<>();
    
        // convert myObject2s to a map, it's convenient for the stream
        Map<Integer, MyObject2> map = myObject2s.stream().collect(Collectors.toMap(MyObject2::getId, Function.identity()));
    
        List<MyJoinObject> myJoinObjects = myObject1s.stream()
                                                     .map(myObject1 -> new MyJoinObject(myObject1, map.get(myObject1.getId()).getError()))
                                                     .collect(Collectors.toList());
    
    }
    
    public MyJoinObject(MyObject1 myObject1, String error){
        this.id = myObject1.getId();
        this.name = myObject1.getName();
        this.error = error;
    }