W Javie jest wiele przydatnych nowych rzeczy. Np. Mogę iterować ze strumieniem nad listą obiektów, a następnie sumować wartości z określonego pola Object
instancji. Na przykład
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Dlatego pytam, czy jest jakiś sposób na zbudowanie, String
który konkatenuje wynik toString()
metody z instancji w jednym wierszu.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Załóżmy, że list
zawiera liczby całkowite 1
, 2
i 3
oczekuję, że concatenated
jest "123"
albo "1,2,3"
.
java-8
java-stream
mat_boy
źródło
źródło
Odpowiedzi:
Jednym prostym sposobem jest dołączenie elementów listy do
StringBuilder
możesz także spróbować:
Objaśnienie: mapa konwertuje strumień liczb całkowitych na strumień ciągów, a następnie jest redukowany jako konkatenacja wszystkich elementów.
Uwaga: To
normal reduction
działa w O (n 2 )dla lepszej wydajności użyj
StringBuilder
lubmutable reduction
podobny do odpowiedzi F. Böllera.Ref: Redukcja strumienia
źródło
join
z drugiej strony wstępnie przydzieliłby pojedynczą tablicę wystarczająco dużą, aby zapisać ostatni łańcuch przed zapełnieniem go, czyniąc go O (n).list.stream().map(Object::toString).reduce("", String::concat)
. Korzystaniemap e-> e.toString()
jest trochę zbędne.joining
Interfejs API zawiera moduł zbierający . Jest to metoda statyczna wCollectors
.Nie idealny z powodu koniecznego wezwania
toString
, ale działa. Możliwe są różne ograniczniki.źródło
import static java.util.stream.Collectors.joining;
Na wypadek, gdyby ktoś próbował to zrobić bez java 8, istnieje całkiem niezła sztuczka. List.toString () już zwraca kolekcję, która wygląda następująco:
[1,2,3]
W zależności od konkretnych wymagań można to przetworzyć dowolnie, o ile elementy listy nie zawierają [] lub,.
Na przykład:
lub jeśli twoje dane mogą zawierać nawiasy kwadratowe:
da ci całkiem rozsądną wydajność.
W każdym wierszu można utworzyć jeden element tablicy w następujący sposób:
Użyłem tej techniki do tworzenia podpowiedzi HTML z listy w małej aplikacji, z czymś takim jak:
Jeśli masz tablicę, zacznij od Arrays.asList (list) .toString ()
Całkowicie posiadam fakt, że nie jest to optymalne, ale nie jest tak nieefektywne, jak mogłoby się wydawać, i jest łatwe do odczytania i zrozumienia. Jest jednak dość nieelastyczny - w szczególności nie próbuj oddzielać elementów poleceniem replaceAll, jeśli dane mogą zawierać przecinki, i użyj wersji podłańcuchowej, jeśli masz w nawiasach kwadratowych dane, ale dla tablicy liczb jest to w zasadzie idealny.
źródło
List
nie wymusza strukturytoString()
.AbstractCollection
Jednak domyślnie korzysta z tej struktury i myślę, że również wszystkieList
implementacje ogólnego przeznaczenia w Java SE. Jako przykład takiego, który tego nie robi,org.springframework.util.AutoPopulatingList
na wiosnę nie implementujetoString()
i dlatego zwróci np. „org.springframework.util.AutoPopulatingList@170a1
”.Arrays.toString()
byłby lepszym wyborem niżArrays.asList(list).toString()
, ponieważ zdefiniowano, aby zwracał równoważny ciąg, jest bardziej zwięzły i nie wymaga dodatkowego tworzenia obiektu.Inne odpowiedzi są w porządku. Można jednak również przekazać Collectors.toList () jako parametr do Stream.collect (), aby zwrócić elementy jako ArrayList.
źródło
System.out.print
(ln)(list)
, użyjetoString()
metody elementów do wydrukowania listy. Zatem ten fragment kodu po prostu powtarza to, co dzieje się wewnątrztoString
Listy.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
źródło
W interfejsie API String istnieje metoda dla przypadków użycia „dołączania listy ciągów”, nawet nie potrzebujesz Stream.
źródło
Lub
Podejście to pozwala również zbudować ciąg znaków z listy obiektów Przykład
Tutaj funkcja zmniejszania pozwala uzyskać pewną wartość początkową, do której chcesz dołączyć nowy ciąg Przykład:
źródło
Testowanie obu podejść sugerowanych w Shail016 i odpowiedzi bpedroso ( https://stackoverflow.com/a/24883180/2832140 ), prosta
StringBuilder
+append(String)
wfor
pętli, wydaje się działać znacznie szybciej niżlist.stream().map([...]
.Przykład: ten kod przechodzi przez
Map<Long, List<Long>>
kompilację łańcucha json, używająclist.stream().map([...]
:Na mojej maszynie deweloperskiej junit zwykle wykonuje od 0,35 do 1,2 sekundy. Podczas korzystania z tego kodu zajmuje od 0,15 do 0,33 sekundy:
źródło
Czy możemy tego spróbować?
źródło
źródło
List
do jednegoString
i oddziela każdy element przecinkiem (,
).Zamierzam użyć interfejsu API strumieni do konwersji strumienia liczb całkowitych na pojedynczy ciąg. Problem z niektórymi z podanych odpowiedzi polega na tym, że wytwarzają one środowisko wykonawcze O (n ^ 2) z powodu budowania ciągów. Lepszym rozwiązaniem jest użycie StringBuilder, a następnie połączenie ciągów razem jako ostatni krok.
Możesz pójść o krok dalej, konwertując kolekcję obiektów na pojedynczy ciąg.
źródło
Z Javą 8+
Nie jest najbardziej wydajny, ale jest to rozwiązanie z niewielką ilością kodu.
źródło
Możesz to zrobić w ten sposób.
źródło