Najfajniejszy sposób na dołączanie do smyczków w Groovy 2.x.


Właśnie próbowałem:
List<String> values = getSomehow()
values.join(",")

Ale zobacz, że
join
jest przestarzałe od 2.1. Więc pytam:

Jak mam to napisać zgodnie z najnowszą preferowaną/niezalecaną składnią?

Czy istnieje sposób, aby to zrobić z zamknięciami? Wydaje mi się, że mógłbym użyć tutaj
collect ()
lub czegoś podobnego.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć wariantu
Iterator
metody
join
w
DefaultGroovyMethods
. Jego podpis jest taki sam, należy podać tylko separator.
Będzie to wyglądać tak:
List<String> values = ["string1", "string2", "string3"]
String joinedValues = values.join(",")

Lub możesz to wszystko zrobić w jednej linii:
String joinedValues = ["string1", "string2", "string3"].join(",")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli obawiasz się wycofania, aktualna wersja Groovy JDK (

http://groovy-lang.org/gdk.html
http://groovy-lang.org/gdk.html) pokazuje metodę
join (String)
w
Iterable
,
Object []
i
Iterator
, z których żadna nie jest przestarzała .
Ponieważ wszystkie kolekcje implementują
Iterable
, Twoja oryginalna składnia była w porządku.
Jeśli naprawdę chcesz użyć zamknięcia, to
List strings = ['this', 'is', 'a', 'list']
String result = strings.inject { acc, val ->
"$acc,$val"
}
assert result == 'this,is,a,list'

działa, ale z pewnością nie jest prostsze niż zwykłe
strings.join (',')
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz użyć wersji
Iterable
lub
Iterator & < Object & >
join
:
join(Iterator<Object> self, String separator)
http://beta.groovy-lang.org/do ... 3join(Iterator%3CObject%3E,%20java.lang.String)
zamiast
join(Collection self, String separator)
.
http://beta.groovy-lang.org/do ... 3join(java.util.Collection,%20java.lang.String)
To jest jedyna wersja funkcji
join
, która jest przestarzała.
join (iterable self, string separator)
i
join (Object [] self, String separator)
to kilka innych używanych.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak widzę w dokumentacji,
join
jest przestarzałe w kolekcjach, ale nie w iterowalnych.
def joinedValues = (values as Iterable).join ', '

Używając domknięć, możesz spróbować zapisać go za pomocą
.inject
,
head
i
tail
:
values.head() + (values.size() > 1 ? values.tail().inject( '' ) { acc, i -> acc+', ' + i } : '')

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się