2014-11-22 5 views
9

Ho appena provato:modo più groovy di unirsi insieme di stringhe in 2.x Groovy

List<String> values = getSomehow() 
values.join(",") 

Ma vediamo che join è stato deprecato a partire dal 2.1. Quindi chiedo: Come dovrei scrivere questo secondo l'ultima sintassi preferita/non deprecata?

Inoltre, c'è un modo per realizzare questo con chiusure? Mi sento come se potessi utilizzare lo collect() o qualcosa di simile qui.

+1

'values.iterator() join ("")' – alfasin

+3

@alfasin 'list' estende' Collection' che estende 'Iterable'. Non è necessario usare '.iterator()'. 'values.join (',')' dovrebbe essere buono. – dmahapatro

risposta

10

È possibile utilizzare la variazione Iterator del metodo join in DefaultGroovyMethods. E 'firma è lo stesso, solo il separatore deve essere passato in

Sarebbe simile a questa:.

List<String> values = ["string1", "string2", "string3"] 
String joinedValues = values.join(",") 

Oppure si può fare tutto in una sola riga:

String joinedValues = ["string1", "string2", "string3"].join(",") 
+7

'List' estende' Collection' che estende 'Iterable'. Non è necessario usare '.iterator()'. – dmahapatro

2

Se sei preoccupato per il problema della deprecazione, la versione corrente di Groovy JDK (http://groovy-lang.org/gdk.html) mostra un metodo join(String) in Iterable, Object[] e Iterator, nessuno dei quali è deprecato.

Poiché tutte le raccolte implementano Iterable, la sintassi originale andava bene.

Se davvero si vuole usare una chiusura, poi

List strings = ['this', 'is', 'a', 'list'] 
String result = strings.inject { acc, val -> 
    "$acc,$val" 
} 
assert result == 'this,is,a,list' 

opere, ma non è certamente altro che l'strings.join(',').

1

Come ho visto nella documentazione, join è deprecato in collezioni, ma non in Iterable.

def joinedValues = (values as Iterable).join ', ' 

Utilizzando le chiusure si potrebbe provare a scrivere con .inject, head e tail:.

values.head() + (values.size() > 1 ? values.tail().inject('') { acc, i -> acc+', ' + i } : '')