2014-09-02 62 views
2

我知道,標題可能有點混亂,但我不能想出一個更好的,所以讓我解釋一下我的意思是......的Java 8的流圖重新使用賦值的變量

我有這一塊代碼:

int spacing = Integer.MAX_VALUE; 

for (Edge edge : edges) { 
    if (!union.connected(edge.getStart(), edge.getEnd())) { 
     spacing = Math.min(spacing, edge.getWeight()); 
    } 
} 

有沒有辦法將此代碼轉換爲java 8代碼?

當然,第一步是過濾,這很簡單,但後來變得更詭計了,因爲我將不得不在計算變量spacing中重用Stream :: map方法,我不知道這是可能的。

+0

請注意,你的代碼是'Java的兼容8'。 – 2014-09-02 02:58:13

+1

當然它是...這是Java 7 ....但我想寫在Java 8風格 – 2014-09-02 03:02:20

+0

你應該澄清。你想使用Java 8的lambda表達式和功能樣式。 – 2014-09-02 03:03:07

回答

4

我不能完全肯定的語法(我不能測試),但它應該是這樣工作的:

int spacing = edges.stream() 
        .filter(edge -> !union.connected(edge.getStart(), edge.getEnd())) 
        .min (Collectors.comparing(Edge::getWeight)) 
        .map (Edge::getWeight) // get the weight of the min Edge 
        .orElse(Integer.MAX_VALUE); 

不知道的比較傳遞給min

如果上面的代碼不工作,你可以mapToInt第一(假設getWeight()返回int):

int spacing = edges.stream() 
        .filter(edge -> !union.connected(edge.getStart(), edge.getEnd())) 
        .mapToInt(Edge::getWeight) 
        .min() 
        .orElse(Integer.MAX_VALUE); 
+1

你所做的唯一的「錯誤」是'min'返回'Optional',所以你需要從中提取實際結果...作爲一般的解決方案,它是完美的... ty(can因爲新用戶的聲譽差而不投票) – 2014-09-02 03:16:44

+0

@SvenVidak感謝您的更正! – Eran 2014-09-02 03:19:44