zealinux
V2EX  ›  Java

[需重构] Java 如何从大对象截取部分字段转为小对象?

  •  
  •   zealinux · Sep 22, 2021 · 3566 views
    This topic created in 1872 days ago, the information mentioned may be changed or developed.

    比如这段代码: 从Goods这个大对象( 20+字段,对应 DB 中 Goods 表)列表里截取( 5 个字段)生成小对象列表( GoodsApiVo )进行返回, 工程里到处都有这样的样板代码。

    假设以后小对象需要获取 10 个字段, 那岂不是,map 那一行写很长很长?

    希望有什么简单的方法进行重构。

    // List<Goods> goods ==>  List<GoodsApiVo> goodsApiVos
    
    List<GoodsApiVo> goodsApiVos = goods.stream()
            .map((Goods s) -> new GoodsApiVo(s.getBarcode(), s.getName(), s.getPrice(), s.getCreateTime(), s.getUpdateTime()))
            .collect(Collectors.toList());
    
    17 replies  •  2021-09-30 08:51:04 +08:00
    eltria
    eltria
    Sep 22, 2021
    1
    大对象小对象字段同名的话,cglib beancopier 就行了,而且对性能的影响是最小化的
    aichunya
    aichunya
    Sep 22, 2021
    2
    BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties);
    这个,可以把不需要的字段 ignore?
    chendy
    chendy
    Sep 22, 2021
    3
    使用 mapstruct 这类的工具做转换,节省一部分代码量
    另外除非涉及到数据安全或者性能之类的问题,返回所有字段也不是什么坏事。。。
    dqzcwxb
    dqzcwxb
    Sep 22, 2021
    4
    手动 set 性能最高且方便维护,改成链式 set 即可
    wolfie
    wolfie
    Sep 22, 2021
    5
    mapstruct + 1
    EscYezi
    EscYezi
    Sep 22, 2021 via iPhone
    6
    mapstruct+1
    Leviathann
    Leviathann
    Sep 22, 2021
    7
    感觉没什么问题,或者你写个静态方法放到 dto 的 class 里
    这部分逻辑本来就是不能少的,换别的方法也只是藏起来,如果有问题更不好找
    youngxhui
    youngxhui
    Sep 22, 2021
    8
    Spring 的 Beauntils 可以方便的实现两个对象之间的属性拷贝
    cubecube
    cubecube
    Sep 22, 2021
    9
    挨个 set 也不费劲。
    还没有黑盒子,bean copy 慢不说,copy 深度还得自己去研究下啥的,没啥太大收益。
    aragakiyuii
    aragakiyuii
    Sep 22, 2021
    10
    new GoodsApiVo(Goods s) 这种比上面那个好点吧,改的话就直接去改构造函数里的东西就行了
    HiShan
    HiShan
    Sep 22, 2021
    11
    实现一个方法:public GoodApiVo toGoodApiVo(String... fields)
    List<GoodsApiVo> goodsApiVos = goods.stream().map((Good::toGoodApiVo).collect(Collectors.toList());
    wowo243
    wowo243
    Sep 22, 2021
    12
    beanUtils 或者 json 序列化再反序列化一下实现拷贝
    siweipancc
    siweipancc
    Sep 22, 2021 via iPhone
    13
    hutool 工具有个 toBean 方法,最快最简单的方法了
    passerbytiny
    passerbytiny
    Sep 22, 2021 via Android
    14
    并不是所有类似代码都能提取成公共处理。从 A 表中提取 5 个字段生成 A2 对象、从 B 表中提取 5 个字段生成 B2 对象,这两个操作
    passerbytiny
    passerbytiny
    Sep 22, 2021 via Android
    15
    就像张三、李四吃饭一样,看起来是类似的但却是实在在是两码事。

    绝对的不复制粘贴代码,是过度模式,楼主贴的代码就是最合适的 2 处理方式。
    AoEiuV020
    AoEiuV020
    Sep 22, 2021
    16
    条件允许的话考虑继承,或者用接口,
    比如 Goods implements GoodsApiVo,
    INTOX8O
    INTOX8O
    Sep 30, 2021
    17
    Jackson 的 ObjectMapper.convertValue() 字段名一样可以直接转换,不一样可以配置模糊匹配或者自定义 Jsonserializer
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   819 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 18:26 · PVG 02:26 · LAX 10:26 · JFK 13:26
    ♥ Do have faith in what you're doing.