Создать список строк в Groovy

Следующий код в Groovy добавляет GStrings в список:

List<String> args = [ 'cmd', "-Dopt=${value}" ]

Когда я создаю ProcessBuilder с этим списком, я получаю ClassCastException. Какой отличный способ привести элементы списка к правильному типу?


person Aaron Digulla    schedule 06.07.2011    source источник
comment
Я добавил комментарий о полном отказе от ProcessBuilder в своем ответе (я публикую это, если вы его пропустили)... Это может сэкономить вам часть работы :-)   -  person tim_yates    schedule 06.07.2011
comment
Одна из моих самых больших проблем с Groovy заключается в том, что он не преобразует тип для вас в этой конкретной ситуации. Компилятор знает типы, поэтому он должен справиться с этим так же легко, как если бы вы присвоили его String. :(   -  person Trejkaz    schedule 27.05.2019


Ответы (3)


Или вы можете сделать:

List<String> args = [ 'cmd', "-Dopt=${value}"] as String[]

or

List<String> args = [ 'cmd', "-Dopt=${value}"]*.toString()

на самом деле, почему вы используете ProcessBuilder из интереса? Groovy добавляет способы управления процессами и даже добавляет три execute методы для списка

Вы можете сделать (это в OS X или Linux):

def opt = '-a'

println( [ 'ls', "$opt" ].execute( null, new File( '/tmp' ) ).text )

который распечатывает файлы в моей папке /tmp

person tim_yates    schedule 06.07.2011
comment
Обратите внимание, что оба выполняют слишком много работы: первый преобразует начальный List в String[], а тот обратно в List, второй также создает копию List и вызывает toString() для каждого элемента. - person Joachim Sauer; 06.07.2011
comment
@Joachim Да, но они оба выглядят чище (ИМХО), чем встраивание toString в список определенных элементов (и это снижает вероятность того, что вы пропустили элемент) - person tim_yates; 06.07.2011
comment
очень верно. Кроме того, крайне маловероятно, что это будет критический элемент в любом пути кода. - person Joachim Sauer; 06.07.2011
comment
ProcessBuilder также принимает String[], поэтому первая альтернатива может быть заменена на: String[] args = [ 'cmd', "-Dopt=${value}"] as String[] - person RonK; 06.07.2011
comment
Re execute: Мне нужно позвонить redirectErrorStream(), но спасибо за предложение. Я мог бы использовать его в другом месте. - person Aaron Digulla; 06.07.2011
comment
@Aaron, вы можете вызвать consumeProcessOutput(OutputStream output, OutputStream error) для объекта Process, возвращенного execute() - person tim_yates; 06.07.2011
comment
tim_yates: +1, но это не на 100% то же самое. Например, вывод и ошибка больше не синхронизируются, когда я делаю это таким образом. - person Aaron Digulla; 06.07.2011

Пытаться

List<String> args = [ 'cmd', "-Dopt=${value}".toString() ]

потому что последний — это GString.

person Erich Kitzmueller    schedule 06.07.2011

Я сделал тест:

def value = "abc"
List<String> args = [ 'cmd', "-Dopt=${value}"];

System.out.println (args.getClass());

System.out.println (args.get(0).getClass());
System.out.println (args.get(1).getClass());

Результат был:

class java.util.ArrayList
class java.lang.String
class org.codehaus.groovy.runtime.GStringImpl

Немного изменив код, чтобы он был:

def value = "abc"
List<String> args = [ 'cmd', "-Dopt=${value}".toString()];

System.out.println (args.getClass());

System.out.println (args.get(0).getClass());
System.out.println (args.get(1).getClass());

произвел это:

class java.util.ArrayList
class java.lang.String
class java.lang.String

Должен сработать, но я не уверен на 100%, что это лучший способ сделать это.

person RonK    schedule 06.07.2011
comment
Небольшой совет: я считаю, что System.out.println(args*.getClass()) легче написать и получить более приятный результат ;-) - person Joachim Sauer; 06.07.2011
comment
@Иоахим, Круто! (или я должен сказать, Groovy!) - person RonK; 06.07.2011