2017-05-25 29 views
1

我使用下面的代码来创建java.util.function功能>实例,并使用功能实例的返回值,将它传递给ExecutorService.submit () 方法。使用java.util.function功能,操作界面给出“无法找到符号”错误

但是,我收到了“未找到符号”异常。请帮助

下面的代码片段:

//Approach-1 
    Function<Integer, Callable<Integer>> doubleIt_1 = (index) -> {return() -> {return index * 2;};}; 
    //Approach-2 
    Function<Integer, Callable<Integer>> doubleIt_2 = (index) ->() -> {return index * 2;}; 
    //Approach 3 
    Function<Integer, Callable<Integer>> doubleIt_3 = (index) ->() -> index * 2; 

    //Use the "doubleIt" lambda function defined above to pass as a Lambda function to ExecutorService threadpool's submit method. 
    Function<Integer, Future<Integer>> task = (Integer index) -> pool.submit(doubleIt_1(index)); 

编译器会引发错误: 的java:找不到符号 符号:方法doubleIt_1(java.lang.Integer中) 位置:类declarative.L12LegacyToFunctionalInterface_4

请帮助...

+0

的编辑的IntelliJ然而示出了不同的异常:“方法调用预期” –

+0

原因doubleIt_1不是函数它是一个变量(算符)。它不是JavaScript,您可以在其中交换函数和变量。 – Lemonov

+0

那么,这意味着你的类没有任何名为doubleIt_1的方法并以Integer为参数。 –

回答

0

必须调用函数的方法,调用doubleIt_1实现,像这样:

//Use the "doubleIt" lambda function defined above to pass as a Lambda function to ExecutorService threadpool's submit method. 
Function<Integer, Future<Integer>> task = (Integer index) -> pool.submit(doubleIt_1.apply(index)); 

函数接口只是有4种方法中,核心之一是apply(T):R,在这里我们通过T值,并将其返回将R的响应。例如:

public static void main(String[] args) { 
    Function<Integer, Double> t = new Function<Integer, Double>() { 

     @Override 
     public Double apply(Integer t) { 
      return t.doubleValue(); 
     } 
    }; 

    callFunction(t, 10); 

    t = (i) -> i.doubleValue(); 
    callFunction(t, 10); 

    t = (Integer i) -> {return i.doubleValue();}; 
    callFunction(t, 10); 

    callFunction((i) -> i.doubleValue(), 10); 

} 

private static Double callFunction(Function<Integer, Double> f, Integer i){ 
    return f.apply(i); 
} 
+0

谢谢,这工作......这是什么意思是,我们必须调用FunctionalInterface的方法,而不是直接传递函数接口就像我们使用Map函数一样。 –