JavaScript ma Array.join()
js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve
Czy Java ma coś takiego? Wiem, że mogę sobie coś ułożyć z StringBuilder:
static public String join(List<String> list, String conjunction)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String item : list)
{
if (first)
first = false;
else
sb.append(conjunction);
sb.append(item);
}
return sb.toString();
}
... ale nie ma sensu tego robić, jeśli coś takiego jest już częścią JDK.
String.join()
metodę. Spójrz na tę odpowiedź, jeśli używasz Java 8 (lub nowszej) stackoverflow.com/a/22577565/1115554Odpowiedzi:
W Javie 8 możesz to zrobić bez biblioteki innej firmy.
Jeśli chcesz dołączyć do kolekcji ciągów, możesz użyć nowej metody String.join () :
Jeśli masz kolekcję innego typu niż String, możesz użyć Stream API z dołączającym Collector :
StringJoiner
Klasy mogą być również użyteczne.źródło
assertThat(String.join(", ", Lists.newArrayList("1", null)), is("1, null"));
[a, b, c]
jak nawiasy klamrowe.Iterable<CharSequence>
; Relacja interfejsu:Iterable -> Collection -> List
Wszystkie odniesienia do Apache Commons są w porządku (i tego używa większość ludzi), ale myślę, że odpowiednik Guava , Joiner , ma znacznie ładniejszy interfejs API.
Możesz zrobić prosty przypadek łączenia za pomocą
ale również łatwo radzi sobie z zerami:
lub
oraz (na tyle przydatne, o ile mnie to interesuje, aby używać go zamiast commons-lang), możliwość radzenia sobie z Mapami:
co jest niezwykle przydatne do debugowania itp.
źródło
.useForLastSeparator()
podobną metodę? W ten sposób możesz uzyskać coś w rodzaju „i” między tylko dwoma ostatnimi elementami (z resztą za pomocą „,”).separator
(który jestfinal
). Wszystko, co widziałem na Guava, gdzie korzystałem z odpowiednika Apache Commons, było o wiele lepsze (czytaj: czystsze, szybsze, bezpieczniejsze i po prostu bardziej solidne w ogóle) na Guava z mniejszą liczbą awarii krawędzi i problemów z bezpieczeństwem wątków i mniejszy ślad pamięci. Wydaje się, że ich zasada przewodnia „najlepszego możliwego sposobu” jest prawdziwa.String.join()
metoda iStringJoiner
klasa.Nie po wyjęciu z pudełka, ale wiele bibliotek ma podobne:
Commons Lang:
Wiosna:
źródło
Na Androidzie możesz użyć klasy TextUtils .
źródło
String.join
wymaga minimum 26 interfejsu API na Androida.Nie, nie ma takiej wygodnej metody w standardowym API Java.
Nic dziwnego, że Apache Commons zapewnia coś takiego w swojej klasie StringUtils na wypadek, gdybyś nie chciał sam pisać.
źródło
isEmpty()
metodę zamiast (statycznej)join()
metody wString
...: rollseyes: :)Trzy możliwości w Javie 8:
źródło
W przypadku kolektora Java 8 można to zrobić za pomocą następującego kodu:
Również najprostsze rozwiązanie w java 8:
lub
źródło
Napisałem ten (używam go do fasoli i wykorzystuję
toString
, więc nie piszCollection<String>
):ale
Collection
nie jest obsługiwany przez JSP, więc dla TLD napisałem:i do
.tld
akt:i użyj go w plikach JSP jako:
źródło
Collection<>
naIterable<>
?Kod, który posiadasz jest właściwym sposobem, aby to zrobić, jeśli chcesz korzystać z JDK bez żadnych zewnętrznych bibliotek. W JDK nie ma prostej „jednej linii”, której można by użyć.
Jeśli możesz korzystać z zewnętrznych bibliotek, zalecamy zajrzenie do org.apache.commons.lang.StringUtils klasy w bibliotece Apache Commons.
Przykład użycia:
źródło
Ortodoksyjnym sposobem na osiągnięcie tego jest zdefiniowanie nowej funkcji:
Próba:
Wynik:
źródło
separator
byłby o wiele bardziej sugestywny.Rozwiązanie Java 8 z
java.util.StringJoiner
Java 8 ma
StringJoiner
klasę. Ale nadal musisz napisać trochę bojlera, ponieważ jest to Java.źródło
Możesz użyć biblioteki apache commons, która ma klasę StringUtils i metodę łączenia.
Sprawdź ten link: https://commons.apache.org/proper/commons-lang/javadocs/api.2.0/org/apache/commons/lang/StringUtils.html
Zauważ, że powyższy link może z czasem stać się nieaktualny, w takim przypadku możesz po prostu wyszukać w sieci hasło „apache commons StringUtils”, które powinno umożliwić znalezienie najnowszej referencji.
(przywołane w tym wątku) Ekwiwalenty Java C # String.Format () i String.Join ()
źródło
Możesz to zrobić:
Lub liniowiec (tylko wtedy, gdy nie chcesz „[” i „]”)
Mam nadzieję że to pomoże.
źródło
Świetny sposób na zrobienie tego za pomocą czystego JDK w jednym wierszu:
Wynik:
Niezbyt doskonały i niezbyt zabawny sposób!
Wynik:
źródło
Możesz wypróbować metodę dołączania Apache Commons StringUtils:
http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#join(java.util.Iterator , java.lang.String)
Przekonałem się, że Apache StringUtils podnosi luz jdka ;-)
źródło
Jeśli korzystasz z kolekcji Eclipse (wcześniej GS Collection ), możesz użyć tej
makeString()
metody.Jeśli możesz przekonwertować swój
List
typ na kolekcje Eclipse, możesz pozbyć się adaptera.Jeśli chcesz tylko łańcuch rozdzielany przecinkami, możesz użyć wersji,
makeString()
która nie przyjmuje parametrów.Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse.
źródło
W java 1.8 strumień może być używany,
źródło
EDYTOWAĆ
Zauważam również
toString()
podstawowy problem z implementacją i element zawierający separator, ale myślałem, że jestem paranoikiem.Ponieważ mam dwa komentarze na ten temat, zmieniam odpowiedź na:
Który wygląda dość podobnie do pierwotnego pytania.
Jeśli więc nie chcesz dodawać całego słoika do swojego projektu, możesz go użyć.
Myślę, że nie ma nic złego w twoim oryginalnym kodzie. W rzeczywistości alternatywa, którą sugerują wszyscy, wygląda prawie tak samo (chociaż wykonuje szereg dodatkowych weryfikacji)
Oto on, wraz z licencją Apache 2.0.
Teraz wiemy, dziękuję open source
źródło
", "
?Interfejs API Google Guava ma również .join (), chociaż (jak powinno być oczywiste w przypadku innych odpowiedzi), Apache Commons jest tutaj standardem.
źródło
Java 8 przynosi
Metoda, która jest nullsafe przy użyciu
prefix + suffix
wartości null.Można go użyć w następujący sposób:
Collectors.joining(CharSequence delimiter)
Metoda po prostu wywołujejoining(delimiter, "", "")
wewnętrznie.źródło
Możesz użyć tego z StringUtils Spring Framework. Wiem, że już o tym wspomniano, ale tak naprawdę możesz po prostu wziąć ten kod i działa natychmiast, bez potrzeby Springa.
źródło
Spróbuj tego:
źródło