• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rqxiao
V2EX  ›  程序员

Java 有没有这样 List<A>转成 List<B>的工具或者方法可以分享下

  •  
  •   rqxiao · Sep 11, 2019 · 9951 views
    This topic created in 2612 days ago, the information mentioned may be changed or developed.

    B 的属性都来自于 A 中,而且只会比 A 少,属性名也一样

    输入 List , B 输出 List

    33 replies  •  2019-09-13 09:41:50 +08:00
    jorneyr
    jorneyr
    Sep 11, 2019
    1
    List<B> listB = listA.stream().map(e => { B b = new B(); BeanUtils.copyProperties(e, b); return b; }).collect(Collectors.toList());

    大概就是这么个样子
    colincat
    colincat
    Sep 11, 2019 via iPhone
    3
    Mapstruct
    wysnylc
    wysnylc
    Sep 11, 2019
    4
    @jorneyr #1 写得没毛病,但是 beanUtils 我建议还是手写 set 因为 copyProperties 对于属性名和类型都有要求而且 spring 和 apache 的规则还不一样,所以最后你会发现还是手动 set 得了
    Ravenddd
    Ravenddd
    Sep 11, 2019 via Android
    5
    笨方法,转成 json 再转 bean
    ilotuo
    ilotuo
    Sep 11, 2019
    6
    1L 手打的吧 "=>" 错了
    简版:
    List<B> listB = listA.stream().mapToObj(B::new).collect(Collectors.toList());
    luozic
    luozic
    Sep 11, 2019 via iPhone
    7
    先转 jsonstring 或者其他序列化的东西再转
    zjp
    zjp
    Sep 11, 2019 via Android
    8
    Dozer 不过已经好几年没有更新了,效率一般
    no1xsyzy
    no1xsyzy
    Sep 11, 2019❤️1
    9
    1. 写成 Haskell 风格函数签名:(A -> B) -> [A] -> [B]

    2. 丢进 hoogle 你就知道这玩意叫做 map:<https://hoogle.haskell.org/?hoogle=%28A+-%3E+B%29+-%3E+%5BA%5D+-%3E+%5BB%5D&scope=set%3Astackage>

    3. 然后去查 Java 里 map 怎么用
    kaedea
    kaedea
    Sep 11, 2019
    10
    函数式编程里的集合操作符了解一下,对应 Java 的实现就是 Stream#map 这个操作符
    kaedea
    kaedea
    Sep 11, 2019
    11
    顺便说一下 Stream 是 Java 8 开始才支持的特性,如果在 Java 8 以前,可以使用类似的 Stream 库,比如 Eclipse 家的,或者直接上 RxJava 也行
    trait
    trait
    Sep 11, 2019
    12
    list_a.iterate().map(|a| a.to_b())
    xuanbg
    xuanbg
    Sep 11, 2019
    13
    Json.toObject(Json.toJson(a), B.class);
    aguesuka
    aguesuka
    Sep 11, 2019 via Android
    14
    有继承关系吗?没有只能依赖反射。lst.stream().map(funcA2B).collect(toList)
    jwk345
    jwk345
    Sep 11, 2019 via iPhone
    15
    dozer 或者 modelmapper
    francis59
    francis59
    Sep 11, 2019
    16
    可以试试 orika-mapper: https://github.com/orika-mapper/orika
    HangoX
    HangoX
    Sep 11, 2019
    17
    自己写个反射拷贝就好了
    hantsy
    hantsy
    Sep 12, 2019
    18
    ModelMapper
    luckylo
    luckylo
    Sep 12, 2019 via Android
    19
    @jorneyr 不建议用 BeanUtils ( spring 包下的)。反正我是莫名其妙的遇见一次效率问题。最后还是手动 setter 好的。

    #3 3 楼的 Mapstruct 听说是个不错选择,还没试过
    PEPEXXX
    PEPEXXX
    PRO
    Sep 12, 2019 via iPhone
    20
    map 操作符……我半个全栈经常遇到你这种问题,无疑 map 是最方便的
    jorneyr
    jorneyr
    Sep 12, 2019
    21
    @ilotuo 哈哈,最近在写 JS,-> 和 JS 的 => 搞混了。
    rqxiao
    rqxiao
    OP
    Sep 12, 2019
    22
    @ilotuo stream().mapToObj 怎么没这方法
    zhaorunze
    zhaorunze
    Sep 12, 2019
    23
    List<A> = (List)(Object)List<B>
    notreami
    notreami
    Sep 12, 2019
    24
    必须 orika 啊
    rqxiao
    rqxiao
    OP
    Sep 12, 2019
    25
    @zhaorunze 这样不行吧,实际上没有转成 List<A> 还是 List<B>
    xiaoyaojc
    xiaoyaojc
    Sep 12, 2019
    26
    首先要看 a 和 b 的内容,是不是可以直接 copy 的,如果是,直接 copy 属性,如果不是,那只能手动 set 了。
    if (CollectionUtils.isEmpty(sourceList)) {
    return Lists.newArrayList();
    }
    List<T> resultList = Lists.newArrayListWithCapacity(sourceList.size());
    for (Object source : sourceList) {
    try {
    T target = targetClass.newInstance();
    copy(source, target);
    resultList.add(target);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }
    return resultList;
    xiaoyaojc
    xiaoyaojc
    Sep 12, 2019
    27
    其中 copy 用 BeanCopier,一般用于对象转换,比如 DO 转 BO 等等。B 的属性都来自于 A 中,而且只会比 A 少,属性名也一样,你的这种情况用 copy 绝对是最快的,不用转 json。转 json 反而慢
    jsnjfz
    jsnjfz
    Sep 12, 2019
    28
    可以看看 guava 中有没工具类
    zhaorunze
    zhaorunze
    Sep 12, 2019❤️1
    29
    @rqxiao 你试一下再说啊
    luckylo
    luckylo
    Sep 12, 2019 via Android
    30
    @zhaorunze java8 貌似没有,好像在 java11 里面有
    rqxiao
    rqxiao
    OP
    Sep 12, 2019
    31
    @zhaorunze 试过了啊 List<A> 里面的元素属性 实际上都是 B 的属性,
    ixx
    ixx
    Sep 12, 2019
    32
    共有属性放在 B 中,A extents B 同时添加多出来的字段 ,剩下的直接转就行了
    mangodai
    mangodai
    Sep 13, 2019
    33
    bean copy util 都有的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1562 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 23:38 · PVG 07:38 · LAX 15:38 · JFK 18:38
    ♥ Do have faith in what you're doing.