1. 概述
自Java 5版本以来,就支持了泛型。Java泛型带来的一个好处是类型安全性。例如,当我们声明了一个List<Integer>
类型的对象myList
时,我们不能将非Integer
类型的数据放入myList
。
然而,在处理泛型集合时,我们经常需要将Collection<TypeA>
转换为Collection<TypeB>
。
在这个教程中,我们将以List<Integer>
为例,探讨如何将List<Integer>
转换为List<String>
。
2. 作为示例准备一个List<Integer>
对象
为了简化,我们将使用单元测试断言来验证转换是否按预期工作。首先,让我们初始化一个整数列表:
List<Integer> INTEGER_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
如上代码所示,INTEGER_LIST
对象中有七个整数。现在,我们的目标是将INTEGER_LIST
中的每个整数元素转换为字符串,例如,将1
转换为"1"
,2
转换为"2"
等。最终结果应等于:
List<String> EXPECTED_LIST = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
在这篇教程中,我们将探讨三种不同的方法来实现这个目标:
- 使用Java 8的流API
- 使用Java的
for
循环 - 使用Guava库
接下来,我们将逐一演示它们。
3. 使用Java 8流的map()
方法
Java 8及更高版本提供了流API,它提供了一系列便捷的接口,使我们可以轻松地处理Collection
。例如,将List<TypeA>
转换为List<TypeB>
的一个常见方法是流的map()
方法:
theList.stream().map( .. the conversion logic.. ).collect(Collectors.toList());
那么,接下来让我们看看如何使用map()
方法将List<Integer>
转换为List<String>
:
List<String> result = INTEGER_LIST.stream().map(i -> i.toString()).collect(Collectors.toList());
assertEquals(EXPECTED_LIST, result);
如上面的代码示例所示,我们传递了一个lambda表达式,调用每个元素(Integer
)的toString()
方法将其转换为String
。
如果运行这段代码,测试通过。所以,流的map()
方法可以完成这项工作。
4. 使用for
循环
我们已经看到map()
方法可以解决问题。但是,如前所述,流API仅在Java 8及以上版本可用。因此,如果我们正在使用较旧的Java版本,就需要用其他方式解决这个问题。
例如,我们可以通过简单的for
循环来实现转换:
List<String> result = new ArrayList<>();
for (Integer i : INTEGER_LIST) {
result.add(i.toString());
}
assertEquals(EXPECTED_LIST, result);
上述代码显示,我们首先创建了一个新的List<String>
对象result
。然后,我们在for
循环中迭代List<Integer>
列表中的元素,将每个Integer
元素转换为String
,并将字符串添加到result
列表中。
如果运行这段代码,测试也会通过。
5. 使用Guava库
当我们处理集合时,将集合类型转换为标准操作。因此,一些流行的外部库提供了执行此类转换的实用方法。
在本节中,我们将使用Guava展示如何解决我们的问题。
首先,让我们在pom.xml
中添加Guava库依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
当然,我们可以在Maven中央仓库中检查最新版本。
接下来,我们可以使用Guava的Lists.transform()
方法来解决这个问题:
List<String> result = Lists.transform(INTEGER_LIST, Functions.toStringFunction());
assertEquals(EXPECTED_LIST, result);
transform()
方法对INTEGER_LIST
中的每个元素应用toStringFunction()
并返回转换后的列表。
如果运行它,测试会通过。
6. 总结
在这篇简短的文章中,我们学习了三种将List<Integer>
转换为List<String>
的方法。如果我们的Java版本是8+,那么流API将是最直接的转换方法。否则,我们可以通过循环或求助于外部库,如Guava,来实现转换。
源代码可在GitHub上找到。