В Java 8 появилось много полезных новых вещей. Например, я могу перебирать поток по списку объектов, а затем суммировать значения из определенного поля Object
экземпляров. Например
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Таким образом, я спрашиваю, существует ли какой-либо способ для создания, String
который объединяет выходные данные toString()
метода из экземпляров в одной строке.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Предположим, что list
содержит целые числа 1
, 2
и 3
, я ожидаю, что concatenated
это "123"
или "1,2,3"
.
java-8
java-stream
mat_boy
источник
источник
Ответы:
Один простой способ - добавить элементы списка в
StringBuilder
Вы также можете попробовать:
Объяснение: карта преобразует поток Integer в поток String, а затем уменьшается как объединение всех элементов.
Примечание: это то,
normal reduction
что выполняет в O (n 2 )для лучшей производительности используйте ответ
StringBuilder
илиmutable reduction
аналогичен ответу Ф. Беллера.Ссылка: сокращение потока
источник
join
с другой стороны, будет предварительно выделен один массив, достаточно большой, чтобы сохранить итоговую строку перед ее заполнением, что делает его O (n).list.stream().map(Object::toString).reduce("", String::concat)
. Использованиеmap e-> e.toString()
немного избыточно.В
joining
API есть коллектор . Это статический метод вCollectors
.Не идеально из-за необходимого вызова
toString
, но работает. Возможны разные разделители.источник
import static java.util.stream.Collectors.joining;
На всякий случай, если кто-то пытается сделать это без Java 8, есть довольно хороший трюк. List.toString () уже возвращает коллекцию, которая выглядит следующим образом:
[1,2,3]
В зависимости от ваших конкретных требований, это может быть постобработано до того, что вы хотите, если ваши элементы списка не содержат [] или,.
Например:
или если ваши данные могут содержать квадратные скобки это:
даст вам довольно разумный вывод.
Один элемент массива в каждой строке может быть создан следующим образом:
Я использовал эту технику для создания всплывающих подсказок HTML из списка в небольшом приложении, с чем-то вроде:
Если у вас есть массив, тогда начните с Arrays.asList (list) .toString ()
Я полностью осознаю тот факт, что это не оптимально, но не так неэффективно, как вы думаете, и довольно просто читать и понимать. Это, однако, довольно негибко - в частности, не пытайтесь разделить элементы с replaceAll, если ваши данные могут содержать запятые, и используйте версию подстроки, если у вас есть квадратные скобки в ваших данных, но для массива чисел это в значительной степени идеальный.
источник
List
не обеспечивает структуруtoString()
.AbstractCollection
однако, эта структура по умолчанию используется, и я думаю, что все реализации общего назначенияList
в Java SE делают то же самое. В качестве примера того, который этого не делает,org.springframework.util.AutoPopulatingList
в Spring не реализуетсяtoString()
и поэтому возвращает, например, "org.springframework.util.AutoPopulatingList@170a1
".Arrays.toString()
было бы лучшим выбором, чемArrays.asList(list).toString()
, поскольку он определен для возврата эквивалентной строки, он более лаконичен и не требует создания дополнительного объекта.Другие ответы в порядке. Однако вы также можете передать Collectors.toList () в качестве параметра в Stream.collect (), чтобы вернуть элементы в виде ArrayList.
источник
System.out.print
(ln),(list)
он будет использоватьtoString()
метод элементов для печати списка. Итак, этот кусок кода просто повторяет то, что происходит внутриtoString
List.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
источник
В String API есть метод для тех «сценариев присоединения к списку строк», вам даже не нужен Stream.
источник
Или
Этот подход позволяет также построить строковый результат из списка объектов. Пример
Здесь функция Reduce позволяет вам иметь некоторое начальное значение, к которому вы хотите добавить новую строку. Пример:
источник
Тестирование обоих подходов, предложенных в Shail016 и ответе bpedroso ( https://stackoverflow.com/a/24883180/2832140 ), простой
StringBuilder
+append(String)
внутриfor
цикла, кажется, выполняется намного быстрее, чемlist.stream().map([...]
.Пример: этот код проходит через
Map<Long, List<Long>>
строку json, используяlist.stream().map([...]
:На моей виртуальной машине dev для выполнения теста junit обычно занимает от 0,35 до 1,2 секунды. В то время как, используя этот следующий код, это занимает от 0,15 до 0,33 секунды:
источник
Можем ли мы попробовать это
источник
источник
List
до одногоString
и разделяет каждый элемент запятой (,
).Я собираюсь использовать API потоков для преобразования потока целых чисел в одну строку. Проблема с некоторыми из предоставленных ответов заключается в том, что они генерируют O (n ^ 2) во время выполнения из-за построения String. Лучшее решение - использовать StringBuilder, а затем объединить строки в качестве последнего шага.
Вы можете продвинуться к этому процессу, преобразовав коллекцию объектов в одну строку.
источник
С Java 8+
Не самое эффективное, но это решение с небольшим количеством кода.
источник
Кроме того, вы можете сделать это.
источник