【问题标题】:Convert a list of functions to can passed to a varargs method arguments [duplicate]将函数列表转换为可以传递给可变参数方法的参数[重复]
【发布时间】:2018-09-04 12:40:26
【问题描述】:
  public Email myMethod(Function<MyObject, String>... functions) { ...  }

我创建了一个函数列表,我想传递给 myMethod:

     List<Function<MyObject, String>>  functions= new ArrayList<>();
        if (condition1) {
            functions.add(myObject->myObject.getStringX());
        } else {
            functions.add(myObject->myObject.getStringY());
        }
        myMethod(functions);//Does not compile, I must find a solution here 
        to convert my list of functions to an array that can be accepted as 
        myMethod argument

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    这是一个array 的函数,所以创建一个这样的函数数组并传递它。

    或者你可以调用它:

    Function<MyObject, String>[] array = new Function[functions.size()];
    functions.toArray(array);
    myMethod(array);
    

    请注意,您不能创建一个通用数组,但您可以这样声明。

    【讨论】:

    • 我尝试了这个解决方案,但出现编译错误:T[ ] 不是功能接口。我也试过这段代码:myMethod(new Function&lt;Translator, String&gt;[functions.size()]); 但还是不行
    • @Imar 不知道你从哪里得到的。你用javac试试这个吗?
    • 你需要流:...locations.stream().toArray(...
    • @MaanooAk 哦,我有 java-11 作为编译器,它解析为在 11 中添加的 Collection::toArray。我的错
    • functions.toArray(array); 返回类型未计入?
    【解决方案2】:

    我认为可以是更简洁的代码

    Function [] functionsArray = new Function[functions.size()];
    for (int i=0;i< functions.size();i++) {
        functionsArray[i] = functions.get(i);
    }
    myMethod(functionsArray); // unchecked assignment here ofcourse
    

    然后我的 IDE 建议我写成

    myMethod(functions.toArray(new Function[0]));
    

    【讨论】:

    • “更干净”在哪方面?一个干净的解决方案是实现接受List&lt;Function&lt;MyObject, String&gt;&gt; 的目标方法,因为您可以通过Arrays.asList 轻松高效地将数组转换为List,而相反的方向包括复制开销和未经检查的操作......
    • @Holger 我的意思是代码的简单性,但我确实借用了一点,即目标方法协定中的参数类型更改是一种更好的处理方式。
    • 可以通过使用改进:Arrays.setAll(functionsArray, functions::get);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2012-08-26
    • 2017-07-05
    • 2020-10-30
    • 2011-04-01
    相关资源
    最近更新 更多