当前位置: 首页 > 面试题库 >

Java多变长参数

鲁博赡
2023-03-14
问题内容

在处理可变长度参数时,我之前没有看到过什么特别的东西

例如,有一个名为prepared statement的方法,带有声明,使得

1。

  String prepareStatement(String... columnNames,String... values) 
//String... columnNames(Eclipse shows error saying The variable argument type String of the method prepareStatement must be the last parameter)

2. 另一个方法声明

  String prepareStatement(int i,String... columnNames,String... values)
  //still the same result as above(The variable ...... parameter)

为什么Java不允许使用多个可变长度参数?还有其他方法可以做到吗?

PS:这样做的原因是我的要求是为传递的参数生成通用的准备好的语句,因为所有此参数都将通过属性传递


问题答案:

仅允许最后一个参数为可变长度:

String prepareStatement(String[] columnNames, String... values)

String …等于String [],因此在这种情况下,您可以为第一个参数插入String [],然后检查它是否为空或有多长。

编辑到您的编辑

如果您确实需要所有字符串作为参数的输入,我建议定义一个真正不常见的字符串来分隔您的输入:

static String prepareStatement(String... params)
{
    String ret = "";
    boolean valueInput = false;
    for(String s : params)
    {
        if(s.equals("MyReallyUncommonSeperateString"))
        {
            valueInput = true;
            ret+="\nvalues\n";//visual delimiter of columnNames and Values
        }
        else if(valueInput)
        {
            //handling of your value inputs
            ret+=s; //example handling, concatenate everything
        }
        else
        {
            //handling of your columnnames
            ret+=s; //example handling, concatenate everything
        }
    }
    return ret;
}

您可以称之为:

System.out.println(prepareStatement("a","b","c","d","e","MyReallyUncommonSeperateString","f","g","h","i","j","k"));

输出:

abcde
values
fghijk

另一种方法是也将columnNames的长度作为参数:

static String prepareStatement(int length, String... params)
{
    String ret = "";
    for(int i = 0; i < length; i++){
        //handling of columnnames
        String colName = params[i];
        //do something with colName

        ret+=colName; //example handling, concatenate everything
    }
    ret+="\nvalues\n";//visual delimiter of columnNames ans Values
    for(int i = length; i < params.length; i++){
        String value = params[i];
        //do something with values

        ret+=value; //example handling, concatenate everything
    }

    return ret;
}

致电:

System.out.println(prepareStatement(5, "a","b","c","d","e","f","g","h","i","j","k"));

和相同的输出:

abcde
values
fghijk


 类似资料:
  • 如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。 func myFunc(a, b, arg ...int) {} 这个函数接受一个类似某个类型的 slice 的参数(详见第 7 章),该参数可以通过第 5.4.4 节中提到的 for 循环结构迭代。 示例函数和调用: func Greeting(prefix

  • 支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数。 package main import "fmt" // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums {

  • 问题内容: 我正在参加本地社区大学的数据结构和算法课程,很有趣。该课程的教科书是Y. Daniel Liang的 Java编程简介,第10版 。这本书本身很扎实。 在处理中,Liang提到了Java的“可变长度”参数。他写道(第265页): Java将可变长度参数视为数组。您可以将数组或可变数量的参数传递给可变长度参数。当调用带有可变数量参数的方法时,Java创建一个数组并将参数传递给它。 一个例

  • 问题内容: 据我了解,一个由固定数量的元素组成,一个与您传递(相同类型)的参数数量一样多。但是他们是一样的吗?我可以通过一个期望的地方吗? 问题答案: 是的,如果您有一个带有varargs参数的方法,例如: 您这样称呼它: 然后编译器将其转换为: 参数的类型为,可以像其他数组变量一样使用。请注意,它 可能 仍然是: 有关更多信息,请参见varargs的文档。 但这 并不 意味着可变参数与阵列互换-

  • 问题内容: 我正在为命令行应用程序做前端。它很长。命令行与此类似: 在我将“模式”开关添加到其中之前,一切似乎都可以正常工作。“模式”开关从命令行执行。我尝试了几种组合方法,将参数拆分为既不执行也不执行的数组。我认为这与“模式”不相关,因为它前面没有,也不能有。 我究竟做错了什么? 编辑:我忘了提到我所能看到的是:调试器停止在不可编译的源代码上。我正在使用netbeans,它似乎无法打印出堆栈跟踪

  • 问题内容: “重要的是要理解,引用变量的类型(而不是它所引用的对象的类型)决定了可以访问哪些成员。” 那句话你到底是什么意思?这仅限于继承概念吗?JVM如何处理它? 问题答案: 这意味着假设您具有: 的类型的 变量 是,但对象的类型是指是。这是变量类型,它决定了您可以执行的操作-因此您无法调用 编译器仅知道您在上调用方法,其中不包括。同样,重载方法仅针对您所知道的方法进行解析: