2012-03-19 22 views
6

¿Hay una forma mejor de hacerlo? Nota: part1, part2 y part3 son variables de cadena definidas en otro lugar (pueden ser nulas).Concatenación de cadenas Groovy con comprobaciones nulas

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

El resultado deseado es una cadena concatenada con valores nulos omitidos.

+0

puede empacar todo en una sola línea a:. 'Def ans = [part1, part2, part3] .removeAll ([nula]) join()', pero No estoy seguro de que eso sea exactamente lo que quieres decir con "mejor". – cdeszaq

+0

@cdeszaq Eso podría ser mejor, pero no funciona. El método removeAll() devuelve un booleano y join() no se puede invocar en un booleano. – Ryan

Respuesta

9

Usted puede hacer esto:

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

Usted podría ser capaz de reducir el tamaño del cierre hasta justo {it} dependiendo de cómo los elementos de lista evaluarán de acuerdo con Groovy Truth, pero esto debe hacerlo un poco más fuerte .

Nota: El GDK javadocs es un gran recurso.

4

Si usa findAll sin parámetros. Se devolverá todos los valores "veraz", por lo que esto debería funcionar:

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

en cuenta que findAll filtrará cadenas vacías (ya que se evalúan como falso en un contexto booleano), pero eso no importa en este caso, ya que las cadenas vacías no agregan nada a join() :)

Si esta es una pregunta simplificada y desea mantener valores de cadena vacíos, puede usar findResults{ it }.

+0

Esto es esencialmente lo mismo que mi respuesta con la adición de confirmar cómo funciona 'findAll', ¿verdad? – cdeszaq

+0

También elimina el cierre pasado a 'findAll' y menciona' findResults', que podría ser útil para otros casos. – epidemian

+0

Buen punto. 'findResults' tiene la capacidad agradable de transformar cosas a medida que se filtra. +1 – cdeszaq

2

Alternativamente, usted puede hacer esto como una operación de plegado con inject:

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

Esta iteración la lista entera y concatena cada elemento sucesivo a un resultado, con la lógica de utilizar la cadena vacía de elementos nulos.

+1

+1 Inject es una forma mucho más poderosa que mi respuesta. Sin embargo, podría ser un poco más complejo y más difícil de entender. – cdeszaq

1

Usted podría utilizar grep:

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

También podría usar '.grep()' ya que usa Groovy Truth como filtro, pero esto es lo mismo que usar 'findAll()'. – cdeszaq

Cuestiones relacionadas