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

时间:2017-06-13 03:57:49

标签: java string variadic-functions

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 /呼叫/约翰

createURI ("%s/call/%s/%s" , "familyName") ==> 5435534 /呼叫/约翰/ familyName

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

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

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

2 个答案:

答案 0 :(得分:1)

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());
 }

您可以加入所有参数到列表,并将其转换为String.format数组。这种方式不会 if 。并且需要呼出:varargs默认大小为 0

答案 1 :(得分: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,但我现在不想查找它们。 )