接收字符串...参数并将其值传递给接收字符串...参数的其他方法

Receiving String... parameters and passing its values to other method that receives String ...parameters

private String createURI (String URL , String... parameters) {
        if (parameters != null && parameters.length > 0) {
            return String.format(URL, "5435534", "John" , parameters[0].toString());
        }

        return String.format(URL, "5435534", "John");
    }

我创建了一个方法,该方法应该支持获取 URL 或 URL+ 其他参数,并根据传递的值从它们创建 URL。 当然 URL 中 %s 的数量应该适合参数的数量。

我是这样用的:

createURI ("%s/call/%s") ==> 5435534/call/John

createURI ("%s/call/%s/%s" , "familyName") ==> 5435534/call/John/familyName

我不想创建这样的东西: String createURI (String URL , String parameter) 当我不想使用它时只传递空字符串然后在方法中检查文本是否为空,然后调用下一种方法:

createURI ("%s/call/%s" , "") 
createURI ("%s/call/%s/%s" , "FamilyName")

我的问题是如何通过将接收到的参数准确发送到 String.format 方法而不显式发送 [0] 项来改进它 - 我不想检查值,String.format 已经这样做了,但对 String 值。如果我只是按原样(类型字符串...)将参数传递给 String.format(URL, "5435534", parameters),它不会收到实际的字符串值,而是收到完整的对象。

private String createURI (String URL , String... parameters) {
        ArrayList<String> strs = new ArrayList<>();
        strs.add("5435534");
        strs.add("John");
        strs.addAll(Arrays.asList(parameters);
        return String.format(URL, strs.toArray());
 }

您可以加入所有参数到List,并将其转换为Array for String.format。这样就不会 if 了。并需要调出:varargs 默认大小为 0.

String.format()(没有 Locale 参数)有两个参数:格式字符串和 Object:

的数组
public static String format(String format,
                            Object... args)

由于第二个参数使用 ... 表示法,您有两种选择来传递第二个参数:您可以将 Object[] 传递给它,或者您可以将零个或多个任意参数传递给它然后将被捆绑到 Object[] 中的类型。只有这两个选择。比方说,您不能传递两个参数,然后传递一个数组,该方法会将其视为第三个、第四个等参数。该数组将被视为单个参数。

但是,您可以创建自己的 Object[] 数组,设置数组的前两个元素,然后将剩余的元素复制到其中,例如:

Object[] formatParameters = new Object[parameters.length + 2];
formatParameters[0] = "5435534";
formatParameters[1] = "John";
for (int i = 0; i < parameters.length; i++) {
    formatParameters[i + 2] = parameters[i];
}
return String.format(URL, formatParameters);

请注意,formatParameters 必须是 Object[] 才能起作用(我认为它不适用于 String[])。这是为了让编译器意识到您传递的是参数数组,而不是类型恰好是数组的单个参数。

(注意:Arrays 中应该有方法可以从 parameters 复制到 formatParameters 而无需循环,但我现在不想查找它们。 )