2016-12-10 33 views
1

如何使用java流,我如何根據字符串(購物服裝)列表執行條件計算?Java 8 Streams如何基於字符串列表對總數進行求和

所以,如果一件襯衫的成本10.5和牛仔褲花費9.5那麼一件襯衫和一個牛仔褲的成本,應20

double totalCost = 0; 
    List <String> shopping = Arrays.asList("Shirt", "Jeans"); 
    shopping.stream() 
    .forEach(string -> { 
     if (string.equals("Shirt")) { 
      totalCost += 10.5d; 
     } else if (string.equals("Jeans")) { 
      totalCost += 9.5d; 
     } 
    }); 
    System.out.println(totalCost); 

上面的代碼甚而不編譯,因爲它不會讓我用totalCost流內

回答

4

您不能從lambda表達式修改局部變量。相反,使用的mapToDoublesum組合:

double totalCost = Arrays.asList("Shirt", "Jeans").stream().mapToDouble(string -> { 
    if (string.equals("Shirt")) { 
     return 10.5d; 
    } else if (string.equals("Jeans")) { 
     return 9.5d; 
    } else { 
     return 0; 
    } 
}).sum(); 
System.out.println(totalCost); 

BTW:你真的不應該爲錢用雙。

0

你真的不應該使用雙。 IEEE 754是非常有問題的。請看下面的例子:

System.out.println(0.1d + 0.2d); 

結果:

0.30000000000000004 

我會用BigDecimal和的項目的成本地圖。

public static void main(String [] args) { 
    final Map<String, BigDecimal> itemCosts = ImmutableMap.of(
      "Shirt", new BigDecimal("10.5"), 
      "Jeans", new BigDecimal("9.5")); 
    final BigDecimal sum = ImmutableList.of("Shirt", "Jeans", "Something").stream() 
      .map(item -> itemCosts.getOrDefault(item, BigDecimal.ZERO)) 
      .reduce(BigDecimal.ZERO, BigDecimal::add); 
    System.out.println(sum); 
} 
相關問題