如何编写方法接收A类型对象列表与映射器,返回B类型对象列表?
实现通用类型转换方法
mapTo 我们可以利用Java的泛型和函数式接口实现这个通用的类型转换方法,让它支持任意类型A到B的转换。
方法定义
定义一个泛型方法,接收两个核心参数:
- 源类型
A的列表List<A> - 映射器
Function<A, B>,负责将单个A类型对象转换为B类型对象
用Java 8+的Stream API可以简化实现逻辑,代码如下:
import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; public class MapperUtils { // 通用类型转换方法 public static <A, B> List<B> mapTo(List<A> sourceList, Function<A, B> mapper) { // 处理空列表,避免空指针异常 if (sourceList == null) { return List.of(); } // 遍历源列表,通过映射器转换每个元素,最终收集为目标类型列表 return sourceList.stream() .map(mapper) .collect(Collectors.toList()); } }
示例使用
针对你给出的String转LocalDate场景,直接传入LocalDate::parse作为映射器即可:
import java.time.LocalDate; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<LocalDate> dates = MapperUtils.mapTo( Arrays.asList("2014-01-01", "2017-05-05"), LocalDate::parse // 用方法引用作为映射器 ); // 验证输出结果 dates.forEach(System.out::println); } }
扩展使用场景
这个方法是通用的,适配各种类型转换需求:
- 将
Integer列表转成String列表:List<String> stringList = MapperUtils.mapTo( Arrays.asList(1, 2, 3, 4), String::valueOf ); - 将自定义对象列表转成属性列表(假设存在
User类,包含getName()方法):List<String> usernames = MapperUtils.mapTo( userList, User::getName );
注意事项
- 如果源列表包含
null元素,映射器需要处理null情况,否则会抛出空指针异常。示例处理方式:List<LocalDate> dates = MapperUtils.mapTo( Arrays.asList("2014-01-01", null, "2017-05-05"), s -> s == null ? null : LocalDate.parse(s) ); - Java 9+可以用
List.of()替代Collectors.toList()返回不可变列表;Java 16+可使用Collectors.toMutableList()获取可变列表。
内容的提问来源于stack exchange,提问作者borkovicz
相关产品推荐
相关产品推荐

