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上找到。