流中的赋值(java)

时间:2015-11-14 16:30:19

标签: java api

我可以从中获取流API吗?

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 个答案:

答案 0 :(得分: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。这由Comparator.comparingDouble(value * price function)处理。它将每个条目映射到某个值,以便进行比较。