使用java流,如何根据字符串列表(购物服装)执行条件计算?
因此,如果衬衫价格为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
答案 0 :(得分:4)
您无法从lambda表达式修改局部变量。相反,请使用mapToDouble
和sum
:
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);
顺便说一句:你真的不应该用双倍的钱。
答案 1 :(得分:0)
你真的不应该使用双倍。 IEEE 754非常有问题。请考虑以下示例:
System.out.println(0.1d + 0.2d);
结果:
0.30000000000000004
我会使用BigDecimal和项目地图&#39;成本。
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);
}