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

Ian*_*Ian 7 java arguments variadic-functions splat

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

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

private String callScript(String scriptLocation, String... extraArgs) throws Exception {
Run Code Online (Sandbox Code Playgroud)

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

ProcessBuilder pb = new ProcessBuilder("something", scriptLocation, /* extraArgs */);
Run Code Online (Sandbox Code Playgroud)

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

  • List<String>
  • String[]
  • String...

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

我目前的解决方法,据我所知,工作正常:

List<String> finalArgs = new ArrayList<String>();
finalArgs.add("something");
finalArgs.add(scriptLocation);
finalArgs.addAll(Arrays.asList(extraArgs));
ProcessBuilder pb = new ProcessBuilder(finalArgs);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ach*_*imh 2

这取决于您对更简单的定义,但您可以利用生成器模式编写一个类:

public class MyProcessBuilder {
    List<String> args;

    MyProcessBuilder( String text, String location ) {
        args = new ArrayList<String>();
        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();
    }
}
Run Code Online (Sandbox Code Playgroud)