2012-03-20 2 views
3

Я пытаюсь вызвать метод Apache Commons StringUtils.join() из класса Groovy. Я хочу объединить 3 строки (part1, part2 и part3).Вызов Java Apache StringUtils.join() из Groovy

Почему это не работает?

def path = StringUtils.join([part1, part2, part3]) //1 

Но следующая строка работает:

def path = StringUtils.join([part1, part2, part3] as String[]) //2 

Следить за вопросом. Почему это работает? Я использую StringUtils v 2.6, поэтому у него нет метода varargs. Всегда ли groovy преобразует параметры метода в массив?

def path = StringUtils.join(part1, part2, part3) //3 

В основном это вопрос любопытства. Я не собираюсь использовать StringUtils, потому что я разместил separate question yesterday и нашел лучшее решение. Тем не менее, я все равно хотел бы понять, почему техника №1 не работает, но № 3 работает.

+0

Для # 1, th e result - это строковое представление массива, а не фактические элементы массива, объединенные вместе. Кажется, массив преобразован в строку, прежде чем он будет отправлен методу join(). – Ryan

ответ

7

Таким образом, чтобы показать, что происходит, давайте напишем сценарий и показать, что выход мы получаем:

@Grab('commons-lang:commons-lang:2.6') 
import org.apache.commons.lang.StringUtils 

def (part1,part2,part3) = [ 'one', 'two', 'three' ] 

def path = StringUtils.join([ part1, part2, part3 ]) 
println "1) $path" 

path = StringUtils.join([ part1, part2, part3 ] as String[]) 
println "2) $path" 

path = StringUtils.join(part1, part2, part3) 
println "3) $path" 

Печатается:

1) [one, two, three] 
2) onetwothree 
3) onetwothree 

В основном, только один из ваших вызовов метода, который соответствует подписи в классе StringUtils: 2), так как он соответствует Object[]method definition. Для двух других, Groovy выбирает наилучшее соответствие, которое может найти для вашего вызова метода.

Для обоих 1) и 3), он делает то же самое. Обертывание параметры как Object[] и вызывая тот же метод, как 2)

Для 3) это хорошо, как вы получите Object[] с 3 элементами, но и для 1), вы получите Object[] с одним элементом; ваш List.

Способ получения его для работы с параметром List, будет использовать spread operator так:

path = StringUtils.join(*[ part1, part2, part3 ]) 
println "4) $path" 

Что бы тогда печать:

4) onetwothree 

Как и следовало ожидать (это поставит все элементы списка в виде отдельных параметров, и затем они будут помещены в Object[] с тремя элементами, как в примере 3)

+0

Этот ответ феноменальный. Хотелось бы, чтобы я мог предоставить несколько повышений. Описание чистое и тщательное. Кроме того, вы упомянули оператора распространения. Спасибо tim_yates. – Ryan

Смежные вопросы