Java 8 流映射<字符串、列表<字符串>>每个键的值的总和

2022-09-04 08:11:15

我对Java 8(仍在学习)并不熟悉,并希望看看我是否可以使用流找到与以下代码等效的东西。

下面的代码主要尝试为 String 中的每个值获取相应的双精度值,然后对其进行求和。我无法在这种格式的任何地方找到太多帮助。我不确定使用流是否会清理代码或使其更加混乱。

// safe assumptions - String/List (Key/Value) cannot be null or empty
// inputMap --> Map<String, List<String>>

Map<String, Double> finalResult = new HashMap<>();
for (Map.Entry<String, List<String>> entry : inputMap.entrySet()) {
    Double score = 0.0;
    for (String current: entry.getValue()) {
        score += computeScore(current);
    }
    finalResult.put(entry.getKey(), score);
}

private Double computeScore(String a) { .. }

答案 1
Map<String, Double> finalResult = inputMap.entrySet()
        .stream()
        .collect(Collectors.toMap(
                Entry::getKey,
                e -> e.getValue()
                      .stream()
                      .mapToDouble(str -> computeScore(str))
                      .sum()));

上面的代码循环访问映射并创建一个具有相同键的新映射,在放置值之前,它首先迭代每个值 - 这是一个列表,通过调用每个列表元素来计算分数,然后对收集到的分数求和以放入值中。computeScore()


答案 2

您还可以将该方法与流 API 结合使用,以生成所需的结果。forEach

Map<String, Double> resultSet = new HashMap<>();
inputMap.forEach((k, v) -> resultSet.put(k, v.stream()
            .mapToDouble(s -> computeScore(s)).sum()));

s -> computeScore(s)可以更改为使用方法参考,即 其中 是包含 的类的名称。T::computeScoreTcomputeScore