Groovy String конкатенация с нулевыми проверками - PullRequest
7 голосов
/ 19 марта 2012

Есть ли лучший способ сделать это?Примечание: part1, part2 и part3 являются строковыми переменными, определенными в другом месте (они могут быть нулевыми).

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

Желаемым результатом является объединенная строка с пропущенными нулевыми значениями.

Ответы [ 4 ]

11 голосов
/ 19 марта 2012

Вы можете сделать это:

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

Вы можете быть в состоянии уменьшить закрытие до {it} в зависимости от того, как ваши элементы списка будут оцениваться в соответствии с Groovy Truth , но это должно сделать его немного более узким .

Примечание. * Javadocs GDK - это ресурс great .

5 голосов
/ 19 марта 2012

Если вы используете findAll без параметров. Он вернет каждое «правдивое» значение, поэтому это должно сработать:

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

Обратите внимание, что findAll будет отфильтровывать пустые строки (потому что они оцениваются как ложные в логическом контексте), но это не имеет значения в этом случае, так как пустые строки ничего не добавляют к join(): )

Если это упрощенный вопрос и вы хотите оставить пустые строковые значения, вы можете использовать findResults{ it }.

2 голосов
/ 19 марта 2012

В качестве альтернативы, вы можете сделать это как операцию сгиба с помощью inject:

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

Это повторяет весь список и объединяет каждый последующий элемент в результат, используя логику для использования пустой строки для нуляэлементы.

1 голос
/ 19 марта 2012

Вы можете использовать grep:

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