1
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());
大概就是这么个样子 |
2
vveexx 2019-09-11 17:52:05 +08:00
|
3
colincat 2019-09-11 18:10:52 +08:00 via iPhone
Mapstruct
|
4
wysnylc 2019-09-11 18:13:12 +08:00
@jorneyr #1 写得没毛病,但是 beanUtils 我建议还是手写 set 因为 copyProperties 对于属性名和类型都有要求而且 spring 和 apache 的规则还不一样,所以最后你会发现还是手动 set 得了
|
5
Ravenddd 2019-09-11 18:16:10 +08:00 via Android
笨方法,转成 json 再转 bean
|
6
ilotuo 2019-09-11 18:18:35 +08:00
|
7
luozic 2019-09-11 18:27:23 +08:00 via iPhone
先转 jsonstring 或者其他序列化的东西再转
|
8
zjp 2019-09-11 18:38:23 +08:00 via Android
Dozer 不过已经好几年没有更新了,效率一般
|
9
no1xsyzy 2019-09-11 18:46:24 +08:00 1
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 怎么用 |
10
kaedea 2019-09-11 18:51:49 +08:00
函数式编程里的集合操作符了解一下,对应 Java 的实现就是 Stream#map 这个操作符
|
11
kaedea 2019-09-11 18:52:57 +08:00
顺便说一下 Stream 是 Java 8 开始才支持的特性,如果在 Java 8 以前,可以使用类似的 Stream 库,比如 Eclipse 家的,或者直接上 RxJava 也行
|
12
trait 2019-09-11 18:55:33 +08:00
list_a.iterate().map(|a| a.to_b())
|
13
xuanbg 2019-09-11 18:57:42 +08:00
Json.toObject(Json.toJson(a), B.class);
|
14
aguesuka 2019-09-11 19:02:29 +08:00 via Android
有继承关系吗?没有只能依赖反射。lst.stream().map(funcA2B).collect(toList)
|
15
jamesxu 2019-09-11 19:07:27 +08:00 via iPhone
dozer 或者 modelmapper
|
16
francis59 2019-09-11 19:07:56 +08:00
可以试试 orika-mapper: https://github.com/orika-mapper/orika
|
17
HangoX 2019-09-11 19:11:50 +08:00
自己写个反射拷贝就好了
|
18
hantsy 2019-09-12 07:28:10 +08:00
ModelMapper
|
19
luckylo 2019-09-12 07:53:35 +08:00 via Android
@jorneyr 不建议用 BeanUtils ( spring 包下的)。反正我是莫名其妙的遇见一次效率问题。最后还是手动 setter 好的。
#3 3 楼的 Mapstruct 听说是个不错选择,还没试过 |
20
vanillaxxx 2019-09-12 08:45:06 +08:00 via iPhone
map 操作符……我半个全栈经常遇到你这种问题,无疑 map 是最方便的
|
23
zhaorunze 2019-09-12 09:31:48 +08:00
List<A> = (List)(Object)List<B>
|
24
notreami 2019-09-12 09:55:56 +08:00
必须 orika 啊
|
26
xiaoyaojc 2019-09-12 10:46:17 +08:00
首先要看 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; |
27
xiaoyaojc 2019-09-12 10:47:57 +08:00
其中 copy 用 BeanCopier,一般用于对象转换,比如 DO 转 BO 等等。B 的属性都来自于 A 中,而且只会比 A 少,属性名也一样,你的这种情况用 copy 绝对是最快的,不用转 json。转 json 反而慢
|
28
jsnjfz 2019-09-12 11:09:06 +08:00
可以看看 guava 中有没工具类
|
32
ixx 2019-09-12 14:14:50 +08:00
共有属性放在 B 中,A extents B 同时添加多出来的字段 ,剩下的直接转就行了
|
33
mangodai 2019-09-13 09:41:50 +08:00
bean copy util 都有的
|