2012-03-19 14 views
6

Czy jest lepszy sposób to zrobić? Uwaga: part1, part2 i part3 są zmiennymi łańcuchowymi zdefiniowanymi gdzie indziej (mogą być zerowe).Łączenie ciągów Groovy z zerowymi sprawdzeniami

def list = [part1, part2, part3] 
list.removeAll([null]) 
def ans = list.join() 

Pożądanym wynikiem jest łączony ciąg znaków z pominiętymi wartościami pustymi.

+0

Można zapakować to wszystko w jednej linii. 'Def ans = [part1, part2, part3] .removeAll ([null]) join()', ale Nie jestem pewien, czy masz na myśli to, co "lepsze". – cdeszaq

+0

@ cdeszaq To może być lepsze, ale to nie działa. Metoda removeAll() zwraca wartość logiczną, a join() nie może zostać wywołana za pomocą metody logicznej Boolean. – Ryan

Odpowiedz

9

Można to zrobić:

def ans = [part1, part2, part3].findAll({it != null}).join() 

Ty może w stanie kurczyć zamknięcie do zaledwie {it} w zależności od tego, jak swoje elementy lista oceni według Groovy Truth, ale to powinno uczynić go nieco mocniej .

Uwaga: GDK javadocs to wielki zasób.

4

Jeśli używasz findAll bez parametrów. powróci co „prawdziwe” wartości, tak to powinno działać:

def ans = [part1, part2, part3].findAll().join() 

Uwaga, findAll będzie odfiltrować pustych strun (bo są oceniane jako fałsz w kontekście logicznym), ale to nie ma znaczenia w tym sprawa, jak puste struny nie dodawać nic do join() :)

Jeśli jest to uproszczony pytanie i chcesz zachować pustych wartości ciągów, można użyć findResults{ it }.

+0

Jest to w zasadzie taka sama jak moja odpowiedź z dodatkiem potwierdzającym działanie 'findAll', prawda? – cdeszaq

+0

Usuwa także zamknięcie przekazane do 'findAll' i wspomina o' findResults', co może być przydatne w innych przypadkach. – epidemian

+0

Dobra uwaga. 'findResults' ma świetną umiejętność przekształcania rzeczy podczas filtrowania. +1 – cdeszaq

2

Alternatywnie, można to zrobić jako krotnym pracy z inject:

def ans = [part1, part2, part3].inject('') { result, element -> 
    result + (element ?: '') 
} 

Ten iteracje całą listę i skleja każdego kolejnego elementu do wyniku, z logiką użyć pusty ciąg dla elementów null.

+1

+1 Inject jest o wiele skuteczniejszą metodą niż moja odpowiedź. To może być nieco bardziej skomplikowane i trudniejsze do zrozumienia. – cdeszaq

1

Można użyć grep:

groovy:000> list = ['a', 'b', null, 'c'] 
===> [a, b, null, c] 
groovy:000> list.grep {it != null}.join() 
===> abc 
+1

Możesz także użyć '.grep()', ponieważ domyślnie używa Groovy Truth jako filtra, ale to jest to samo, co użycie 'findAll()'. – cdeszaq

Powiązane problemy