Java 8 Streams如何根据字符串列表总计总和

时间:2016-12-10 22:31:48

标签: java java-8 java-stream

使用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

2 个答案:

答案 0 :(得分: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);
顺便说一句:你真的不应该用双倍的钱。

答案 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);
}