2016-12-10 13 views
1

Javaストリームを使用して、ストリング(ショッピング・ウェア)のリストに基づいて条件付き計算を実行するにはどうすればよいですか?シャツは10.5コストとジーンズは9.5の費用場合Java 8ストリングのリストに基づいて合計を合計する方法

それでは1枚のシャツと1人のジーンズは、それは文句を言わない私は、ストリーム内のtotalCostを使用させているため、上記のコードのdoesntのはコンパイルすら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); 

かかるはず

答えて

4

ラムダ式からローカル変数を変更することはできません。ところで

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); 

:代わりに、mapToDoublesumの組み合わせを使用するあなたは本当にお金のための二重使用しないでください。

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); 
} 
関連する問題