У меня есть список целых чисел, List<Integer>
и я хотел бы преобразовать все целочисленные объекты в строки, завершив тем самым новый List<String>
.
Естественно, я мог бы создать новый List<String>
и перебирать список, вызывающий String.valueOf()
каждое целое число, но мне было интересно, есть ли лучший (читай: более автоматический ) способ сделать это?
java
string
collections
integer
ChrisThomas123
источник
источник
Используя Коллекции Google из Guava-Project , вы можете использовать
transform
метод в классе ListsList
Возвращаемыйtransform
это вид в списке основы - преобразование будет применяться при каждом доступе к преобразованному списку.Имейте в виду, что при применении к null
Functions.toStringFunction()
будет генерироваться aNullPointerException
, поэтому используйте его только в том случае, если вы уверены, что ваш список не будет содержать null.источник
Решение для Java 8. Немного длиннее Guava, но, по крайней мере, вам не нужно устанавливать библиотеку.
источник
toString
примера это немного длиннее , но в итоге оно короче для преобразований, не поддерживаемых библиотекой Guava Functions. Пользовательские функции по-прежнему просты, но это значительно больше кода, чем этот поток Java 8То, что вы делаете, в порядке, но если вы чувствуете необходимость «Java-it-up», вы можете использовать Transformer и метод collect из Apache Commons , например:
..а потом..
источник
Источник String.valueOf показывает это:
Не то чтобы это важно, но я бы использовал toString.
источник
Вместо String.valueOf я бы использовал .toString (); он позволяет избежать автобокса, описанного @ johnathan.holland
В javadoc говорится, что valueOf возвращает то же, что и Integer.toString ().
источник
Вот однострочное решение без обмана с библиотекой, отличной от JDK.
источник
Другое решение с использованием Guava и Java 8
источник
Не ядро Java и не обобщенное, но популярная библиотека коллекций общего пользования Джакарты содержит некоторые полезные абстракции для такого рода задач. В частности, взгляните на методы сбора на
CollectionUtils
Что следует учитывать, если вы уже используете в своем проекте общие коллекции.
источник
Тем, кого беспокоит «бокс», в jsight ответ: нет.
String.valueOf(Object)
здесь используется, и распаковка вint
не выполняется.Используете ли вы
Integer.toString()
или этоString.valueOf(Object)
зависит от того, как вы хотите обрабатывать возможные значения NULL. Вы хотите выбросить исключение (возможно) или иметь в вашем списке «нулевые» строки (возможно). Если первое, вы хотите бросить какой-NullPointerException
нибудь другой тип?Также есть один небольшой недостаток в ответе jsight:
List
это интерфейс, в нем нельзя использовать оператор new. Я бы, вероятно, использовалjava.util.ArrayList
в этом случае, тем более что мы заранее знаем, насколько длинным может быть список.источник
источник
@Jonathan: Я могу ошибаться, но я считаю, что String.valueOf () в этом случае вызовет функцию String.valueOf (Object), а не будет вставлен в String.valueOf (int). String.valueOf (Object) просто возвращает «null», если он равен нулю, или вызывает Object.toString (), если не равно null, что не должно включать бокс (хотя, очевидно, задействовано создание экземпляров новых строковых объектов).
источник
Я думаю, что использование Object.toString () для любых целей, кроме отладки, вероятно, действительно плохая идея, хотя в этом случае они функционально эквивалентны (при условии, что в списке нет нулей). Разработчики могут изменять поведение любого метода toString () без предупреждения, включая методы toString () любых классов в стандартной библиотеке.
Даже не беспокойтесь о проблемах с производительностью, вызванных процессом упаковки / распаковки. Если производительность критична, просто используйте массив. Если это действительно важно, не используйте Java. Попытка перехитрить JVM приведет только к душевной боли.
источник
Ответ только для экспертов:
источник
String
) будет использовать один и тот же резервный массив (fromall
), поэтому на самом деле будет достаточно эффективно использовать память, что было бы важно для долгосрочной производительности. Если, конечно, вы не хотите сохранить только один из элементов ...Lambdaj позволяет сделать это очень простым и понятным способом. Например, предположим, что у вас есть список целых чисел и вы хотите преобразовать их в соответствующее строковое представление, вы можете написать что-то вроде этого;
Lambdaj применяет функцию преобразования только во время итерации результата.
источник
Вы не можете избежать «накладных расходов на бокс»; Поддельные универсальные контейнеры Java могут хранить только объекты, поэтому ваши целые числа должны быть помещены в целые числа. В принципе, можно было бы избежать перехода от Object к Integer (поскольку это бессмысленно, потому что Object достаточно хорош как для String.valueOf, так и для Object.toString), но я не знаю, достаточно ли умен компилятор для этого. Преобразование из String в Object должно быть более или менее беспроблемным, поэтому я не склонен беспокоиться об этом.
источник
Мы можем использовать итератор, чтобы добиться того же.
источник
Использование потоков: если, скажем, результатом является список целых чисел (
List<Integer> result
), то:Один из способов ее решения. Надеюсь это поможет.
источник
Немного более краткое решение с использованием метода forEach из исходного списка:
источник
Просто для удовольствия, решение, использующее платформу fork-join jsr166y, которая должна быть в JDK7.
(Заявление об ограничении ответственности: не скомпилировано. Спецификация не доработана и т. Д.)
Вряд ли в JDK7 есть немного вывода типа и синтаксический сахар, чтобы сделать это с помощью вызова сопоставления менее подробным:
источник
Это такая простая вещь, что я бы не стал использовать внешнюю библиотеку (это вызовет зависимость в вашем проекте, которая вам, вероятно, не понадобится).
У нас есть класс статических методов, специально созданных для выполнения подобных задач. Поскольку код для этого очень прост, мы позволяем Hotspot выполнять оптимизацию за нас. Похоже, что в последнее время это тема в моем коде: напишите очень простой (понятный) код и позвольте Hotspot творить чудеса. У нас редко возникают проблемы с производительностью вокруг такого кода - с выходом новой версии виртуальной машины вы получаете все дополнительные преимущества скорости и т. Д.
Как бы мне ни нравились коллекции Jakarta, они не поддерживают Generics и используют 1.4 в качестве ЖК-дисплея. Я с осторожностью отношусь к коллекциям Google, потому что они указаны как уровень поддержки Alpha!
источник
Я просто хотел предложить объектно-ориентированное решение проблемы.
Если вы моделируете объекты предметной области, то решение находится в объектах предметной области. Домен здесь - это список целых чисел, для которых нам нужны строковые значения.
Самый простой способ - вообще не преобразовывать список.
При этом, чтобы преобразовать без преобразования, измените исходный список Integer на List of Value, где Value выглядит примерно так ...
Это будет быстрее и займет меньше памяти, чем копирование списка.
Удачи!
источник