【问题标题】:Java Convert List<TypeA> to List<TypeB>Java 将 List<Type> 转换为 List<Type>
【发布时间】:2020-07-05 11:29:51
【问题描述】:

例如

class TypeA {
    private String a;
    private String b;
    private String c;
}

class TypeB {
    private String a;
}

现在我有一个TypeA 的列表,我只需要来自TypeA 的信息a。 将List&lt;TypeA&gt; 转换为List&lt;TypeB&gt; 的最有效方法是什么

【问题讨论】:

  • 我不知道这里的效率是一个问题。您总是需要遍历List&lt;TypeA&gt; 中的每个元素并创建TypeB 的新实例。你遇到什么问题了吗?到目前为止,您尝试过什么?
  • 以何种方式高效 - 运行速度最快?需要最少的思考?如果“跑得最快”——为什么一开始就有 TypeA 和 TypeB,最有效的方法可能是摆脱一个而只使用另一个?您甚至需要列表中的所有项目吗?
  • 因为没有 setter、getter 或构造函数,你... 不能 ...转换这些类型。您无法从任一对象获取或放置数据。
  • List&lt;TypeB&gt; listOfBs = listOfAs.stream().map(a -&gt; {TypeB b = new TypeB(); b.a = a.a; return b;}).collect(Collectors.toList()

标签: java list generics arraylist converters


【解决方案1】:

答案取决于您所说的“高效”。

// Option 1
List<TypeB> bList = new ArrayList<>();
for (TypeA a : aList) {
    bList = new TypeB(s.getA());
}

// Option 2
List<TypeB> bList = aList.stream()
        .map(TypeA::getA)
        .map(TypeB::new)
        .collect(Collectors.toList());

// Option 3
List<TypeB> bList = aList.stream().map(a -> new TypeB(s.getA())).collect(toList());

第一个表现最好。这是一种效率。

第二个和第三个是单个语句。这是另一种效率。

【讨论】:

    【解决方案2】:

    以什么方式高效?在可维护性和清晰度方面,我投票支持对象映射库,例如基于反射和注释的ModelMapper 或MapStruct。对于 MapStruct,您可以为对象 TypeA 和 TypeB 定义映射,并在同一映射接口中使用相关方法。

    @Mapper
    public interface TypeA Mapper {
    
        @Mapping(target="a")
        TypeB typeAToTypeB(TypeA typeA) 
    
        List<TypeB> listOfTypeAToListOfTypeB(List<TypeA> list);
    }
    

    您始终可以使用 或简单的 for 循环进行简单的迭代:

    List<TypeB> listOfTypeB = listOfTypeA.stream()
        .map(typeA -> new TypeB(typeA.getA())
        .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多