只因生命在继续才盲目地产生信念,这种信念是空的。——乔桑塔亚那

前两天写了mapstruct的spring拓展

里面提到了一个Converter

一般我们是对象之间互转,如果是集合的话,可以用Stream#map去一个一个转换

实际上org.springframework.core.convert.ConversionService也为我们提供了参数为org.springframework.core.convert.TypeDescriptor的转换

例如我这里封装一个集合之间的转换

SpringContextHolder工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.ArrayList;
import java.util.List;

import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;

import lombok.experimental.UtilityClass;

/**
* 转换工具类
*
* @author <achao1441470436@gmail.com>
* @since 2022/5/7 18:56
*/
@UtilityClass
public class ConvertUtil {

private static final ConversionService CONVERSION_SERVICE = SpringContextHolder.getBean(ConversionService.class);


public static <T> T convert(@NonNull Object source, Class<T> targetType) {
return CONVERSION_SERVICE.convert(source, targetType);
}


public static Object convert(@NonNull Object source, @Nullable TypeDescriptor sourceType, TypeDescriptor targetType) {
return CONVERSION_SERVICE.convert(source, sourceType, targetType);
}

@SuppressWarnings("unchecked")
public static <T, R> List<R> convertList(List<T> source, Class<R> targetClass) {
if (CollectionUtils.isEmpty(source)) {
return new ArrayList<>();
}
return (List<R>) convert(source, TypeDescriptor.collection(List.class,
TypeDescriptor.valueOf(source.get(0).getClass())),
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(targetClass)));
}
}

使用起来只需要:

1
final List<UserVO> result = ConvertUtil.convertList(userList, UserVO.class);

注意前置条件需要配置了UserUserVO的转换器

如何配置?本篇博客第一行有说明