我有一个整数列表, List<Integer>
,我想将所有整数对象转换为字符串,最终得到一个新的 List<String>
。
当然,我可以创建一个新的 List<String>
并循环遍历该列表,对每个整数调用 String.valueOf()
,但我想知道是否有更好(即:更自动化)的方法来完成这个任务?
我有一个整数列表, List<Integer>
,我想将所有整数对象转换为字符串,最终得到一个新的 List<String>
。
当然,我可以创建一个新的 List<String>
并循环遍历该列表,对每个整数调用 String.valueOf()
,但我想知道是否有更好(即:更自动化)的方法来完成这个任务?
通过使用Guava项目的Google Collections,你可以在Lists类中使用transform
方法。
import com.google.common.collect.Lists;
import com.google.common.base.Functions
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = Lists.transform(integers, Functions.toStringFunction());
transform
返回的List
是对原始列表的视图 - 在访问转换后的列表时将应用转换。请注意,当应用于空值时,Functions.toStringFunction()
会抛出NullPointerException
异常,因此仅在确定列表不包含空值时才使用它。Java 8 的解决方案。比 Guava 的方案稍微长一些,但至少您不需要安装库。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
//...
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
.collect(Collectors.toList());
对于Java 11,
List<String> strings = integers.stream().map(Object::toString)
.collect(Collectors.toUnmodifiableList());
仍然没有 map
的便捷方法,真的吗?
toString
示例有点长,但对于 Guava Functions 库不支持的转换来说,它最终变得更短。自定义函数仍然很容易,但它需要比 Java 8 stream 更多的代码。 - lightswitch05List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<>(oldList.size());
for (Integer myInt : oldList) {
newList.add(String.valueOf(myInt));
}
你现在的做法是正确的,但如果你想要“Java化”一下可以使用Transformer和collect方法,它们来自于Apache Commons,例如:
public class IntegerToStringTransformer implements Transformer<Integer, String> {
public String transform(final Integer i) {
return (i == null ? null : i.toString());
}
}
...然后...
CollectionUtils.collect(
collectionOfIntegers,
new IntegerToStringTransformer(),
newCollectionOfStrings);
List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
我会建议使用.toString()代替String.valueOf; 这可以避免@johnathan.holland所描述的一些自动装箱问题。
javadoc表示,valueOf返回与Integer.toString()相同的内容。
List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());
for (Integer myInt : oldList) {
newList.add(myInt.toString());
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
虽然这并不重要,但我会使用toString。
使用Guava和Java 8的另一种解决方案
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
List<String> stringList = integerList.stream().map((Object s)->String.valueOf(s)).collect(Collectors.toList())
String.valueOf(Object)
,并且从未执行过将 int
拆箱。Integer.toString()
还是 String.valueOf(Object)
取决于你如何处理可能的 null 值。你想抛出异常(可能),还是在列表中有“null”字符串(也许)。如果是前者,你想抛出 NullPointerException
还是其他类型的异常?List
是一个接口,不能在它上面使用 new 运算符。在这种情况下,我可能会使用 java.util.ArrayList
,特别是因为我们事先知道列表可能的长度。
new ArrayList<>(Lists.transform(integers, Functions.toStringFunction()))
。 - JRA_TLLLists.transform(listOfStrings, Ints.stringConverter());
- LateralFractal