Преобразование списка <Integer>в список <String> - PullRequest
95 голосов
/ 20 августа 2008

У меня есть список целых чисел, List<Integer>, и я хотел бы преобразовать все целочисленные объекты в строки, таким образом заканчивая новым List<String>.

Естественно, я мог бы создать новый List<String> и пройти по списку, вызывая String.valueOf() для каждого целого числа, но мне было интересно, есть ли лучший (читай: более автоматический ) способ выполнения это?

Ответы [ 19 ]

90 голосов
/ 04 августа 2009

Используя Google Collections из Guava-Project , вы можете использовать метод 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, представляет собой представление в списке поддержки - преобразование будет применяться при каждом доступе к преобразованному списку.

Имейте в виду, что Functions.toStringFunction() выдаст NullPointerException при применении к нулю, поэтому используйте его, только если вы уверены, что в вашем списке не будет нуля.

72 голосов
/ 20 августа 2008

Насколько я знаю, итерации и создание экземпляров - единственный способ сделать это. Что-то вроде (для потенциальной помощи других, так как я уверен, что вы знаете, как это сделать):

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)); 
}
68 голосов
/ 12 апреля 2014

Решение для 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());
40 голосов
/ 21 августа 2008

То, что вы делаете, хорошо, но если вы чувствуете необходимость «Java-it-up», вы можете использовать Transformer и метод сбора из 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);
9 голосов
/ 20 августа 2008

Источник для String.valueOf показывает это:

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

Не то чтобы это имело большое значение, но я бы использовал toString.

9 голосов
/ 20 августа 2008

Вместо использования 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()); 
}
8 голосов
/ 25 апреля 2011

Это однострочное решение без мошенничества с библиотекой не-JDK.

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
5 голосов
/ 25 апреля 2014

Другое решение с использованием Guava и Java 8

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
3 голосов
/ 28 августа 2008

Людям, обеспокоенным «боксом» в ответе jsight: их нет. String.valueOf(Object) используется здесь, и распаковка на int не выполняется.

Используете ли вы Integer.toString() или String.valueOf(Object), зависит от того, как вы хотите обрабатывать возможные нули. Вы хотите сгенерировать исключение (возможно) или иметь «нулевые» строки в своем списке (возможно). Если первое, вы хотите бросить NullPointerException или какой-то другой тип?

Кроме того, один маленький недостаток в ответе jsight: List - это интерфейс, вы не можете использовать новый оператор для него. Я бы, вероятно, использовал java.util.ArrayList в этом случае, тем более что мы заранее знаем, как долго будет длиться список.

3 голосов
/ 21 августа 2008

Не ядро ​​Java, и не универсальное, но в популярной библиотеке коллекций общин Джакарты есть несколько полезных абстракций для решения подобных задач. В частности, посмотрите на методы сбора на

CollectionUtils

Что следует учесть, если вы уже используете коллекции общих ресурсов в своем проекте.

...