5分钟快3首页    注册   登录
5分钟快3 = way to explore
5分钟快3 是一个5分钟快3关于 分享和探索的地方
现在注册
已注册用户请  登录
5分钟快3  ›  程序员

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

  •  
  •   rqxiao · 8 天前 · 1886 次点击

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

    输入 List , B 输出 List

    33 回复  |  直到 2019-09-13 09:41:50 +08:00
        1
    jorneyr   8 天前
    List<B> listB = listA.stream().map(e => { B b = new B(); BeanUtils.copyProperties(e, b); return b; }).collect(Collectors.toList());

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

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

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

    #3 3 楼的 Mapstruct 听说是个不错选择,还没试过
        20
    parorisim   7 天前 via iPhone
    map 操作符……5分钟快3我 半个全栈经常遇到5分钟快3你 这种问题,无疑 map 是最方便的
        21
    jorneyr   7 天前
    @ilotuo 哈哈,最近在写 JS,-> 和 JS 的 => 搞混了。
        22
    rqxiao   7 天前
    @ilotuo stream().mapToObj 怎么没这5分钟快3方法
        23
    zhaorunze   7 天前
    List<A> = (List)(Object)List<B>
        24
    notreami   7 天前
    必须 orika 啊
        25
    rqxiao   7 天前
    @zhaorunze 这样不行吧,实际上没有转成 List<A> 还是 List<B>
        26
    xiaoyaojc   7 天前
    首先要看 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.ne5分钟快3Win stance();
    copy(source, target);
    resultList.add(target);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }
    return resultList;
        27
    xiaoyaojc   7 天前
    其中 copy 用 BeanCopier,一般用于对象转换,比如 DO 转 BO 等等。B 的属性都来自于 A 中,而且只会比 A 少,属性名也一样,5分钟快3你 的这种情况用 copy 绝对是最快的,不用转 json。转 json 反而慢
        28
    jsnjfz   7 天前
    可以看看 guava 中有没5分钟快3工具 类
        29
    zhaorunze   7 天前   ♥ 1
    @rqxiao 5分钟快3你 试一下再说啊
        30
    luckylo   7 天前 via Android
    @zhaorunze java8 貌似没有,好像在 java11 里面有
        31
    rqxiao   7 天前
    @zhaorunze 试过了啊 List<A> 里面的元素属性 实际上都是 B 的属性,
        32
    ixx   7 天前
    共有属性放在 B 中,A extents B 同时添加多出来的字段 ,剩下的直接转就行了
        33
    mangodai   6 天前
    bean copy util 都有的
    5分钟快3关于   ·   FAQ   ·   API   ·   5分钟快35分钟快3我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小5分钟快3工具   ·   2555 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 13:52 · PVG 21:52 · LAX 06:52 · JFK 09:52
    ♥ Do have faith in what you're doing.