2015-11-14 56 views
0

我可以從這裏獲取流API嗎?流中的賦值(java)

public String getTheMostExpensiveIngredient() { 
    double help = 0.0; 
    List<String> result = new ArrayList<>();  
    for(Map.Entry<Ingredient, Double> x : list.entrySet()) { 
     if((x.getKey().getPrice() * x.getValue() > help)) { 
      help = x.getKey().getPrice() * x.getValue();   
      result.add(x.getKey().getName()); 
     } 
    } 
    return result.get(result.size()-1); 
} 
+1

你是什麼意思?你想用Java 8 [Streams](https://docs.oracle.com/javase/tutorial/collections/streams/)編寫這段代碼嗎? – Tunaki

+0

是的,請:)這是我在這個網站上的第一個問題,所以對錯誤感到抱歉。 – Micky

+1

我們可以得到更完整的代碼片段嗎?至少包括一個包裝方法以及一些背景。 –

回答

3

就我所見,只是尋找max元素的名稱。你不修改任何狀態。或者你不必。隨着流,你可以做

String getTheMostExpensiveIngredient(Map<Ingredient, Double> map) { 
    return map.entrySet().stream() // Stream<Map.Entry<Ingredient, Double>> 
      .max(Comparator.comparingDouble(
        e -> e.getValue() * e.getKey().getPrice())) // Optional<Map.Entry<..>> 
      .map(e -> e.getKey().getName()) // Optional<String> 
      .orElse(null);     // just String 
} 
  • 首先這原來你有到它的流地圖的條目。
  • 然後它使用Stream.max方法獲取最大條目。
  • 最後它從條目中提取名稱並將其轉換爲原始字符串。

「棘手」的部分是告訴流api如何定義最大值。它期望一個Comparator的Map條目。這由Comparator.comparingDouble(value * price function)處理。它將每個條目映射到某個值,以便進行比較。

+0

非常感謝:) Stream.max從來不知道這個函數。 – Micky