在Groovy中创建字符串列表

9
以下Groovy代码将GString添加到列表中:
List<String> args = [ 'cmd', "-Dopt=${value}" ]

当我使用这个列表创建一个ProcessBuilder时,我会遇到一个ClassCastException。有没有一种简洁的方法将列表元素强制转换为正确的类型?


我在我的回答中添加了一条评论,建议避免使用ProcessBuilder(如果您错过了这个建议)... 这可能会为您节省一些工作 :-) - tim_yates
我对Groovy最大的不满之一是,在这种特定情况下它不会为你转换类型。编译器知道类型,所以它应该能够像将其分配给字符串一样轻松地处理它。:( - Hakanai
3个回答

18

或者,你可以这样做:

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

或者

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

其实,你为什么要使用ProcessBuilder呢?Groovy提供了进程管理的方法,甚至添加了三个execute方法给List使用

你可以这样做(在Mac OS X或Linux上):

def opt = '-a'

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

这个程序会打印出我 /tmp 文件夹中的文件。


1
@Joachim 是的,但它们两个看起来比在特定元素上嵌入 toString 更干净(在我看来),而且这样做可以减少你错过一个元素的可能性。 - tim_yates
非常正确。而且这很不可能成为任何代码路径上的关键因素。 - Joachim Sauer
ProcessBuilder 还可以接受一个 String[] - 因此第一个选项可以替换为:String[] args = [ 'cmd', "-Dopt=${value}"] as String[] - RonK
关于execute:我需要调用redirectErrorStream(),但还是谢谢你的建议。我可以在另一个地方使用它。 - Aaron Digulla
1
@Aaron,你可以在execute()返回的Process对象上调用consumeProcessOutput(OutputStream output, OutputStream error) - tim_yates
显示剩余2条评论

2

尝试

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

因为后者是一个GString


1

我做了一个测试:

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

这应该可以解决问题,但我不确定这是否是最佳的解决方法。


3
小提示:我发现 System.out.println(args*.getClass()) 更容易编写并产生更好的输出;-) - Joachim Sauer
@Joachim,太棒了!(或者我应该说,Groovy!) - RonK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接