计算Java 8流中可能包含无效数字的映射值的总和

use*_*342 1 java java-8

我有一张地图: Map<String, Map<String, String>> x

我想计算第二张地图中的值总和:

x.values().stream().mapToDouble(y -> Double.parse(y.get("myKey"))).sum();
Run Code Online (Sandbox Code Playgroud)

但是,如果y.get("myKey")不是有效数字,它将按预期抛出错误...有没有办法可以避免它并只传递有效数字

我看到来自guava库的Doubles.tryParse会返回null,因为它不可解析.但我无法弄清楚如何使用它来只加总有效数字.

And*_*eas 7

无需使用第三方库,只需抓住NumberFormatException:

double sum = x.values().stream().mapToDouble(y -> {
    try {
        return Double.parseDouble(y.get("myKey"));
    } catch (NumberFormatException e) {
        return 0.0;
    }
}).sum();
Run Code Online (Sandbox Code Playgroud)

您还可以捕获RuntimeException是否应忽略缺失值,而不是导致NullPointerException.

  • 我对此的主要反对意见是可读性,您可以通过将逻辑提取到实用程序类中来轻松解决此问题。我认为这更干净:`x.values()。stream()。mapToDouble(Numbers :: parseDoubleOrDefault).sum()` (2认同)

shm*_*sel 5

Doubles.tryParse()如果失败,则返回null。这是您可以利用它的优势:

x.values()
    .stream()
    .map(y -> Doubles.tryParse(y.get("myKey")))
    .filter(Objects::nonNull)  // exclude invalid numbers
    .mapToDouble(Double::doubleValue)
    .sum();
Run Code Online (Sandbox Code Playgroud)