[需重构] Java 如何从大对象截取部分字段转为小对象? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zealinux
V2EX    Java

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

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

    绝对的不复制粘贴代码,是过度模式,楼主贴的代码就是最合适的 2 处理方式。
    AoEiuV020
        16
    AoEiuV020  
       Sep 22, 2021
    条件允许的话考虑继承,或者用接口,
    比如 Goods implements GoodsApiVo,
    INTOX8O
        17
    INTOX8O  
       Sep 30, 2021
    Jackson 的 ObjectMapper.convertValue() 字段名一样可以直接转换,不一样可以配置模糊匹配或者自定义 Jsonserializer
    About     Help     Advertise     Blog     API     FAQ     Solana     5310 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 263ms UTC 09:29 PVG 17:29 LAX 02:29 JFK 05:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86