如何借助Apache CollectionUtils实现List类型转换及自定义转换方法?
我来帮你理清楚这个问题,从CollectionUtils.transform()的工作原理,到编写独立的转换方法,再到实际使用,一步步拆解:
1. 先搞懂
CollectionUtils.transform()的工作原理 这个方法的核心逻辑其实很直白:
- 它接收两个参数:待转换的集合,和一个实现了
Transformer<I,O>接口的对象 - 内部会遍历集合中的每一个元素,调用Transformer的
transform(I input)方法,把输入类型I的元素转换成目标类型O - 最后用转换后的元素直接替换原集合中的对应元素(划重点:它是修改原集合,不会返回新的集合!)
Transformer是一个函数式接口,定义大概是这样:
public interface Transformer<I, O> { O transform(I input); }
说白了就是个"类型转换器模板",你只需要实现它的transform方法,定义好从输入到输出的转换规则就行。
2. 编写独立的转换方法(不用在main里写匿名类)
你可以把转换逻辑封装成独立的工具类和方法,方便复用,这里有两种常用方式:
方式一:写独立的Transformer实现类(适合复杂/复用的转换逻辑)
比如我们要实现Integer转String的转换器,先写一个独立的Transformer类:
import org.apache.commons.collections4.Transformer; // 独立的Integer转String转换器 public class IntegerToStringTransformer implements Transformer<Integer, String> { @Override public String transform(Integer input) { // 可以加自定义的异常/空值处理 if (input == null) { return ""; } return input.toString(); } }
然后封装成工具方法,放在自己的工具类里:
import org.apache.commons.collections4.CollectionUtils; import java.util.List; public class MyCollectionTransformer { // 通用的List转换方法,支持任意类型 public static <I, O> void transformList(List<I> sourceList, Transformer<I, O> transformer) { CollectionUtils.transform(sourceList, transformer); } // 专门针对Integer转String的快捷方法 public static void convertIntListToStringList(List<Integer> intList) { transformList(intList, new IntegerToStringTransformer()); } }
方式二:用Lambda简化(适合简单转换逻辑,代码更简洁)
因为Transformer是函数式接口,所以可以直接用Lambda表达式代替独立类,省去写额外类的麻烦:
import org.apache.commons.collections4.CollectionUtils; import java.util.List; public class MyCollectionTransformer { // 通用方法不变 public static <I, O> void transformList(List<I> sourceList, Transformer<I, O> transformer) { CollectionUtils.transform(sourceList, transformer); } // 用Lambda实现Integer转String的快捷方法 public static void convertIntListToStringList(List<Integer> intList) { transformList(intList, input -> input == null ? "" : input.toString()); } }
3. 实际使用示例
不管用哪种方式,调用起来都很简单,比如在业务代码里:
import java.util.ArrayList; import java.util.List; public class Demo { public static void main(String[] args) { // 准备测试数据 List<Integer> intList = new ArrayList<>(); intList.add(1); intList.add(2); intList.add(null); intList.add(4); // 调用我们的独立方法 MyCollectionTransformer.convertIntListToStringList(intList); // 输出结果:[1, 2, , 4] System.out.println(intList); // 如果需要其他类型转换,比如String转Integer,用通用方法自定义规则 List<String> strList = new ArrayList<>(); strList.add("10"); strList.add("20"); strList.add("abc"); MyCollectionTransformer.transformList(strList, input -> { try { return Integer.parseInt(input); } catch (NumberFormatException e) { return -1; // 处理转换失败的情况 } }); // 输出结果:[10, 20, -1] System.out.println(strList); } }
几个注意点
- 如果不想修改原集合,记得先复制一个新集合再转换:
List<Integer> newList = new ArrayList<>(originalList); - 不可变集合(比如
Collections.unmodifiableList()返回的)不能用这个方法,因为无法修改元素,会抛出异常 - 如果你用的是Java 8+,其实也可以结合Stream API实现类似功能(返回新集合),但既然你问的是Commons Collections的方法,就专注讲这个啦
内容的提问来源于stack exchange,提问作者sank
相关产品推荐
相关产品推荐

