是否有更简单的替代方法来模仿splat运算符?

我发现它可以在Ruby中使用,但我从我在Python中所做的事情中认识到它; “splat”运算符。 长话短说,我想知道是否有更简单的方法来完成我目前的工作,模仿“splat”操作符的作用。

我做了一个中心方法,其余的可以打电话,因为我意识到我有几个非常相似的方法,除了一些小的东西,他们都在做同样的事情。 这是方法签名:

private String callScript(String scriptLocation, String... extraArgs) throws Exception { 

我想要至少一个参数( scriptLocation ),然后允许任意数量的额外参数。 我最终做的就是创建一个ProcessBuilder 。 我的愿望是做这样的事情:

 ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */); 

但是,当然, ProcessBuilder构造函数只接受以下内容:

  • List
  • String[]
  • String...

所以我的方法显然不起作用。

据我所知,我当前的解决方法是:

 List finalArgs = new ArrayList(); finalArgs.add("something"); finalArgs.add(scriptLocation); finalArgs.addAll(Arrays.asList(extraArgs)); ProcessBuilder pb = new ProcessBuilder(finalArgs); 

(是的,我知道我不必使用List ,只能创建一个String[]

(是的,我知道我可以遍历extraArgs并将它们单独添加到extraArgs ,而不必使用addAllArrays.asList()

(是的,我知道我可以通过返回与变量参数相结合的某些参数来创建一个有效完成我的变通方法的函数)

所以我猜这些最后三个陈述之外,还有什么可以实现这个目标吗?

这取决于你对simpler的定义,但你可以使用Builder模式编写一个类:

 public class MyProcessBuilder { List args; MyProcessBuilder( String text, String location ) { args = new ArrayList(); args.add( text ); args.add( location ); } MyProcessBuilder arg( String arg ) { args.add( arg ); return this; } MyProcessBuilder args( String... args ) { this.args.addAll( Arrays.asList( args ) ); return this; } public ProcessBuilder go() { return new ProcessBuilder( args ); } public static MyProcessBuilder callScript( String location ) { return new MyProcessBuilder( "something", location ); } public static void main( String[] args ) { callScript( "/tmp/bla" ).arg( "something else" ).arg( "more" ).go(); } } 

写一个实用程序splat()并发布它?:)

这可能看起来更统一:

 List finalArgs = new ArrayList(); finalArgs.addAll(Arrays.asList( "something" )); finalArgs.addAll(Arrays.asList( scriptLocation )); finalArgs.addAll(Arrays.asList( extraArgs ))); ProcessBuilder pb = new ProcessBuilder(finalArgs); 

你打电话时

 ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */); 

如果你有

 public ProcessBuilder(String something, String scriptLocation, String... extraArgs); 

然后,您可以通过多种方式调用此方法:

 ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh"); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg"); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh","someArg","someArg2"); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh"); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{}); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg"}); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",new String[]{"someArg","someArg2"}); ArrayList someStringList = new ArrayList(); someStringList .add("SomeArg"); someStringList .add("SomeArg2"); String[] extraArgs = someStringList .toArray(new String[someStringList .size()]); ProcessBuilder pb = new ProcessBuilder("something", "/tmp/script.sh",extraArgs);