Вызов Java Apache StringUtils.join () из Groovy - PullRequest
3 голосов
/ 20 марта 2012

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

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

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, потому что вчера я опубликовал отдельный вопрос и нашел лучшее решение.Однако я все еще хотел бы понять, почему метод № 1 не работает, а № 3 работает.

1 Ответ

7 голосов
/ 20 марта 2012

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

@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[] . Для двух других Groovy выбирает лучшее соответствие, которое можно найти для вашего вызова метода.

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

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

Чтобы заставить его работать с параметром List, можно использовать оператор распространения , например, так:

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

Который тогда напечатает:

4) onetwothree

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

...