Java8 Map的总和

Jig*_*aik 4 java java-8 java-stream

是否可以在下面一行中使用Java8编写所有空字符串和空字符串检查的代码?

Map<Integer, Map<String, Object>> data = new HashMap<>(holdings.rowMap());

Set<Entry<Integer, Map<String, Object>>> entrySet = data.entrySet();
double transactedQuantity = 0;
for (Entry<Integer, Map<String, Object>> entry : entrySet) {
    Map<String, Object> value = entry.getValue();
    Object qty = value.get("quantity");
    if (qty != null && qty != "") {
        transactedQuantity += Double.valueOf(qty.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

像下面这样

data.values().stream().filter((k,v) -> k.equals("quantity") && v != null && v != "").flatMapToDouble(...);
Run Code Online (Sandbox Code Playgroud)

Rav*_*ala 6

这个怎么样,

data.values().stream()
    .map(m -> m.get("quantity"))
    .filter(qty -> qty != null && qty != "")
    .mapToDouble(qty -> Double.valueOf(qty.toString()))
    .sum();
Run Code Online (Sandbox Code Playgroud)

  • 可以进一步简化为将data.entrySet()。stream().map(e-&gt; e.getValue()。get(“ quantity”)))替换为data.values().stream().map( valueMap-&gt; valueMap.get(“ quantity”))` (4认同)

ans*_*hul 5

以下代码可能是解决方案:

double transactedQuantity  = data.values()
                .stream()
                .map(valueMap -> valueMap.get("quantity"))
                .filter(exactQuantity -> exactQuantity != null)
                .map(quantityInString -> quantityInString.toString())
                .filter(quantity -> !quantity.isEmpty())
                .mapToDouble(quantityInString -> Double.valueOf(quantityInString))
                .sum();

Run Code Online (Sandbox Code Playgroud)