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

2019-09-11 17:40:21 +08:00
 rqxiao

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

输入 List , B 输出 List

8301 次点击
所在节点    程序员
33 条回复
jorneyr
2019-09-11 17:48:09 +08:00
List<B> listB = listA.stream().map(e => { B b = new B(); BeanUtils.copyProperties(e, b); return b; }).collect(Collectors.toList());

大概就是这么个样子
vveexx
2019-09-11 17:52:05 +08:00
colincat
2019-09-11 18:10:52 +08:00
Mapstruct
wysnylc
2019-09-11 18:13:12 +08:00
@jorneyr #1 写得没毛病,但是 beanUtils 我建议还是手写 set 因为 copyProperties 对于属性名和类型都有要求而且 spring 和 apache 的规则还不一样,所以最后你会发现还是手动 set 得了
Ravenddd
2019-09-11 18:16:10 +08:00
笨方法,转成 json 再转 bean
ilotuo
2019-09-11 18:18:35 +08:00
1L 手打的吧 "=>" 错了
简版:
List<B> listB = listA.stream().mapToObj(B::new).collect(Collectors.toList());
luozic
2019-09-11 18:27:23 +08:00
先转 jsonstring 或者其他序列化的东西再转
zjp
2019-09-11 18:38:23 +08:00
Dozer 不过已经好几年没有更新了,效率一般
no1xsyzy
2019-09-11 18:46:24 +08:00
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
2019-09-11 18:51:49 +08:00
函数式编程里的集合操作符了解一下,对应 Java 的实现就是 Stream#map 这个操作符
kaedea
2019-09-11 18:52:57 +08:00
顺便说一下 Stream 是 Java 8 开始才支持的特性,如果在 Java 8 以前,可以使用类似的 Stream 库,比如 Eclipse 家的,或者直接上 RxJava 也行
trait
2019-09-11 18:55:33 +08:00
list_a.iterate().map(|a| a.to_b())
xuanbg
2019-09-11 18:57:42 +08:00
Json.toObject(Json.toJson(a), B.class);
aguesuka
2019-09-11 19:02:29 +08:00
有继承关系吗?没有只能依赖反射。lst.stream().map(funcA2B).collect(toList)
jamesxu
2019-09-11 19:07:27 +08:00
dozer 或者 modelmapper
francis59
2019-09-11 19:07:56 +08:00
可以试试 orika-mapper: https://github.com/orika-mapper/orika
HangoX
2019-09-11 19:11:50 +08:00
自己写个反射拷贝就好了
hantsy
2019-09-12 07:28:10 +08:00
ModelMapper
luckylo
2019-09-12 07:53:35 +08:00
@jorneyr 不建议用 BeanUtils ( spring 包下的)。反正我是莫名其妙的遇见一次效率问题。最后还是手动 setter 好的。

#3 3 楼的 Mapstruct 听说是个不错选择,还没试过
vanillaxxx
2019-09-12 08:45:06 +08:00
map 操作符……我半个全栈经常遇到你这种问题,无疑 map 是最方便的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/600122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX