将List <Integer>转换为List <String>

java string collections integer

175728 观看

20回复

1393 作者的声誉

我有一个整数列表,List<Integer>我想将所有整数对象转换为字符串,从而完成一个新的List<String>

当然,我可以创建一个新的List<String>循环遍历列表调用String.valueOf()每个整数,但我想知道是否有更好的(读取:更自动)的方式吗?

作者: ChrisThomas123 的来源 发布者: 2008 年 8 月 20 日

回应 20


72

21606 作者的声誉

决定

据我所知,迭代和实例化是唯一的方法。有点像(对于其他潜在的帮助,因为我确定你知道如何做到这一点):

List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<String>(oldList.size()) 
for (Integer myInt : oldList) { 
  newList.add(String.valueOf(myInt)); 
}
作者: jsight 发布者: 2008 年 8 月 20 日

2

21606 作者的声誉

@Jonathan:我可能会弄错,但我相信在这种情况下String.valueOf()将调用String.valueOf(Object)函数,而不是将其装箱到String.valueOf(int)。String.valueOf(Object)如果为null则返回“null”,如果为非空则调用Object.toString(),这不应该涉及装箱(尽管明显涉及实例化新的字符串对象)。

作者: jsight 发布者: 2008 年 8 月 20 日

9

64014 作者的声誉

而不是使用String.valueOf我使用.toString(); 它避免了@ 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()); 
}
作者: ScArcher2 发布者: 2008 年 8 月 20 日

2

8282 作者的声誉

我认为将Object.toString()用于除调试以外的任何目的可能是一个非常糟糕的主意,即使在这种情况下两者在功能上是等价的(假设列表没有空值)。开发人员可以自由地更改任何toString()方法的行为,而不会发出任何警告,包括标准库中任何类的toString()方法。

甚至不担心装箱/拆箱过程造成的性能问题。如果性能至关重要,只需使用数组即可。如果它真的很重要,请不要使用Java。试图超越JVM只会导致心痛。

作者: Outlaw Programmer 发布者: 2008 年 8 月 20 日

9

3423 作者的声誉

String.valueOf的来源显示了这个:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

并不重要,但我会使用toString。

作者: Mike Polen 发布者: 2008 年 8 月 20 日

1

15199 作者的声誉

你无法避免“拳击开销”; Java的仿制通用容器只能存储对象,因此您的整数必须装入整数。原则上它可以避免从Object到Integer的向下转换(因为它没有意义,因为Object对String.valueOf和Object.toString都足够好),但我不知道编译器是否足够聪明。从String到Object的转换应该或多或少是一个no-op,所以我不愿意担心那个。

作者: DrPizza 发布者: 2008 年 8 月 20 日

3

22272 作者的声誉

不是核心Java,也不是通用的,但流行的Jakarta commons集合库对这类任务有一些有用的抽象。具体来说,看看收集方法

CollectionUtils

如果您已在项目中使用commons集合,则需要考虑一些事项。

作者: serg10 发布者: 2008 年 8 月 20 日

40

26901 作者的声誉

你在做什么是好的,但如果你觉得有必要的Java-它一起“你可以使用一个变压器收集方法,从Apache的共享,例如:

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);
作者: SCdF 发布者: 2008 年 8 月 21 日

3

226414 作者的声誉

在jsight的回答中,关注“拳击”的人:没有。String.valueOf(Object)在这里使用,并且不int执行任何拆箱操作。

您是否使用Integer.toString()String.valueOf(Object)取决于您希望如何处理可能的空值。你想抛出一个异常(可能),或者你的列表中有“null”字符串(也许)。如果是前者,你想抛出一种NullPointerException或其他类型吗?

此外,jsight响应中的一个小缺陷:List是一个接口,你不能在它上面使用new运算符。java.util.ArrayList在这种情况下我可能会使用a ,特别是因为我们事先知道列表可能有多长。

作者: erickson 发布者: 2008 年 8 月 28 日

2

128987 作者的声誉

仅限专家的答案:

    List<Integer> ints = ...;
    String all = new ArrayList<Integer>(ints).toString();
    String[] split = all.substring(1, all.length()-1).split(", ");
    List<String> strs = Arrays.asList(split);
作者: Tom Hawtin - tackline 发布者: 2008 年 9 月 11 日

0

128987 作者的声誉

只是为了好玩,使用jsr166y fork-join框架的解决方案应该在JDK7中。

import java.util.concurrent.forkjoin.*;

private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
    ParallelArray.create(ints.size(), Integer.class, executor)
    .withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
        return String.valueOf(i);
    }})
    .all()
    .asList();

(免责声明:未编译。规范尚未最终确定。等等)

不太可能在JDK7中有一些类型推断和语法糖,使得withMapping调用更简洁:

    .withMapping(#(Integer i) String.valueOf(i))
作者: Tom Hawtin - tackline 发布者: 2008 年 9 月 14 日

0

0 作者的声誉

这是一个基本的事情,我不会使用外部库(它会导致您可能不需要的项目依赖)。

我们有一类专门用于完成这些工作的静态方法。因为这个代码非常简单,所以我们让Hotspot为我们做优化。这似乎是我最近的代码中的一个主题:编写非常简单(直接)的代码,让Hotspot发挥其神奇作用。我们很少遇到像这样的代码的性能问题 - 当新的VM版本出现时,您将获得所有额外的速度优势等。

尽管我喜欢Jakarta系列,但他们不支持Generics并使用1.4作为LCD。我对Google Collections很谨慎,因为它们被列为Alpha支持级别!

作者: John Wright 发布者: 2008 年 9 月 24 日

90

22459 作者的声誉

使用Guava-Project中的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());

List通过返回transform是一个视图背衬列表上-变换将在每个访问变换表来施加。

请注意,当应用于null时Functions.toStringFunction()将抛出一个NullPointerException,因此只有在确定列表不包含null时才使用它。

作者: Ben Lings 发布者: 2009 年 8 月 4 日

2

10520 作者的声誉

Lambdaj允许以非常简单和可读的方式执行此操作。例如,假设您有一个Integer列表,并且您想要在相应的String表示中转换它们,您可以编写类似的东西;

List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
    public String convert(Integer i) { return Integer.toString(i); }
}

Lambdaj仅在您对结果进行迭代时才应用转换函数。

作者: Mario Fusco 发布者: 2010 年 3 月 7 日

8

24127 作者的声誉

这是一个单行解决方案,没有与非JDK库作弊。

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
作者: Garrett Hall 发布者: 2011 年 4 月 25 日

-1

761 作者的声誉

我只是想用一个面向对象的问题解决方案。

如果您对域对象建模,则解决方案位于域对象中。这里的域是我们想要字符串值的整数列表。

最简单的方法是根本不转换列表。

话虽这么说,为了转换而不转换,将原始的Integer列表更改为List of Value,其中Value看起来像这样......

class Value {
    Integer value;
    public Integer getInt()
    {
       return value;
    }
    public String getString()
    {
       return String.valueOf(value);
    }
}

这比复制List更快,占用更少的内存。

祝好运!

作者: Rodney P. Barbati 发布者: 2012 年 9 月 7 日

68

5963 作者的声誉

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());
作者: Trejkaz 发布者: 2014 年 4 月 11 日

5

1013 作者的声誉

另一个使用Guava和Java 8的解决方案

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
作者: sandrozbinden 发布者: 2014 年 4 月 25 日

0

1829 作者的声誉

我没有看到任何遵循空间复杂性原则的解决方案。如果整数列表包含大量元素,那么这是一个很大的问题。

It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.

我们可以使用迭代器来实现同样的目的。

    List<Integer> oldList = new ArrayList<>();
    oldList.add(12);
    oldList.add(14);
    .......
    .......

    List<String> newList = new ArrayList<String>(oldList.size());
    Iterator<Integer> itr = oldList.iterator();
    while(itr.hasNext()){
        newList.add(itr.next().toString());
        itr.remove();
    }
作者: nagendra547 发布者: 2017 年 8 月 29 日

0

231 作者的声誉

List<String> stringList = integerList.stream().map((Object s)->String.valueOf(s)).collect(Collectors.toList())
作者: Mahesh Yadav 发布者: 2019 年 6 月 19 日
32x32