2017-05-25 30 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函數一樣。 –