【问题标题】:Merging multiple objects with list fields将多个对象与列表字段合并
【发布时间】:2019-02-08 09:37:17
【问题描述】:

我正在处理具有字符串属性列表的对象:

public class MyObjectOne {
     private List<String> listOne;
     private List<String> listTwo;
     private MyObjectTwo myObjectTwo;
}

public class MyObjectTwo {
     private List<String> listOne;
     private List<String> listTwo;
} 

我想合并多个 MyObjectOne 对象, 这样我就得到了一个新对象,其中所有列表都合并了,包括嵌套对象 MyObjectTwo 中的那些。

我意识到可能有更好的方法来构建程序,这样我就不必这样做了,但我坚持使用这段代码。

有没有什么方法可以实现这一点而不必为对象显式编写映射器?在实践中,每个对象都有 10 多个这样的 List 属性,并且有多个嵌套对象,因此将它们全部写出来将是一个巨大的痛苦。

【问题讨论】:

    标签: java merge


    【解决方案1】:

    我会使用接口,它可以返回所有要合并的列表和所有嵌套对象。 喜欢这个:

    interface Mergable {
        List<List<String>> getAllLists();
    
        List<Mergable> getAllNestedObjects();
    }
    
    class MyObjectOne implements Mergable {
        private List<String> listOne;
        private List<String> listTwo;
        private MyObjectTwo myObjectTwo;
    
        @Override
        public List<List<String>> getAllLists() {
            return Stream.of(listOne, listTwo).collect(toList());
        }
    
        @Override
        public List<Mergable> getAllNestedObjects() {
            return Stream.of(myObjectTwo).collect(toList());
        }
    }
    
    class MyObjectTwo implements Mergable {
        private List<String> listOne;
        private List<String> listTwo;
    
        @Override
        public List<List<String>> getAllLists() {
            return Stream.of(listOne, listTwo).collect(toList());
        }
    
        @Override
        public List<Mergable> getAllNestedObjects() {
            return Collections.emptyList();
        }
    }
    

    然后通过递归将它们全部合并到 List 或您要存储它的任何地方。

    【讨论】:

      【解决方案2】:

      将以下方法添加到MyObjectOnelistOnelistTwoMyObjectTwo 类的getter。顺便说一句,您应该先自己尝试一下。

      public List<String> merge(){
          List<String> result = new ArrayList();
          result.addAll(listOne);
          result.addAll(listTwo);
          result.addAll(myObjectTwo.getListOne());
          result.addAll(myObjectTwo.getListTwo());
          return result;
      }
      

      【讨论】:

      • 我不想要一个大列表,我想要一个新对象,其中 listOne 字段全部合并到 listOne 属性中,所有 listTwo 字段都合并到 listTwo 属性中,等等。另外,我应该有可能提到过,我不能自己编辑对象。
      • @Spacejockey 请编辑问题,因为目前还不清楚这是一项要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2019-03-12
      • 2020-12-03
      • 2018-04-21
      • 2021-09-20
      • 2021-10-25
      相关资源
      最近更新 更多