2014-03-28 65 views
1

我需要用一個方法執行一個方法來創建一個Callable列表,每個列表都有一個範圍爲[1..99]的int參數。我最初的想法是:Return Callable <Double> intStream對象中的mapToObj函數列表

List<Callable<Double>> list = new ArrayList<>(100); 
IntStream.range(1, 99).forEach(i -> list.add(() -> calculateResult(i))); 

接下來的想法是收集項目清單:

List<Callable<Double>> list = IntStream.range(1, 99).mapToObj(value -> (() -> calculateResult(value))).collect(Collectors.toList()); 

它看起來不錯,但在mapToObj功能不承認內部lambda作爲可贖回<雙>。 如果我使用典型的內部類這樣它的工作原理:

List<Callable<Double>> list = IntStream.range(1, 99).mapToObj(new IntFunction<Callable<Double>>() { 
     @Override 
     public Callable<Double> apply(int value) { 
      return() -> calculateResult(value); 
     } 
    }).collect(Collectors.toList()); 

有什麼辦法返回類型傳遞給lambda表達式?

+0

「calculateResult」的簽名究竟是什麼? – skiwi

回答

1

您是否在尋找類似的東西?

public static void main(String[] args) { 
    List<Callable<Double>> list = IntStream.range(1, 99) 
      .<Callable<Double>>mapToObj(value -> callableFactory(value)) 
      .collect(Collectors.toList()); 
} 

public static Callable<Double> callableFactory(int value) { 
    return new Callable<Double>() { 
     @Override public Double call() { return calculateResult(value); } 
    }; 
} 

public static Double calculateResult(int value) { 
    return Math.random(); 
} 
+0

感謝您的回答。在再次詢問問題之前,我應該查看方法聲明... – pawelbial

1

插入演員和您的解決方案編譯:

List<Callable<Double>> list = IntStream.range(1, 99) 
    .mapToObj(value -> (Callable<Double>) (() -> calculateResult(value))) 
    .collect(Collectors.toList()); 
1

你可以做到這一點通過以下方式:

public double calculateResult(int value) { 
    return 0.0d; 
} 

List<Callable<Double>> list = IntStream.range(1, 99) 
     .<Callable<Double>>mapToObj(value -> (() -> calculateResult(value))) 
     .collect(Collectors.toList()); 

我在這裏應用的變化是,我明確地鍵入mapToObj呼叫,因爲你想把流映射到Stream<Callable<Double>>,你需要給出明確的類型,這是你如何做到的。

我仍在試圖弄清楚爲什麼需要顯式類型。