簡體   English   中英

如何找到鍵包含給定前綴的 map 的值的總和?

[英]How to find the sum of values of map whose key contains the given prefix?

我有一個具有以下簽名的方法:

int sum(Map<String, Integer> map, String target) { }

我試圖找到 key 具有前綴作為給定target字符串的條目的值的總和。 我想使用流來做到這一點。 這就是我所做的:

return map.entrySet().stream()
    .filter((k, v) -> k.startsWith(target))
    .map((k, v) -> v)
    .sum();

編譯器給出以下錯誤:

錯誤:不兼容的類型:lambda 表達式中的參數類型不兼容

我在這里做錯了什么?

問題是entrySet()Entry<>的集合,沒有單獨的kv 你應該嘗試這樣的事情:

return map.entrySet().stream()
    .filter((entry) -> entry.getKey().equals(target))
    .mapToInt((entry) -> entry.getValue())
    .sum();

或者對於您的編輯版本,使用startsWith

return map.entrySet().stream()
    .filter((entry) -> entry.getKey().startsWith(target))
    .mapToInt((entry) -> entry.getValue())
    .sum();

Map 的entrySet返回一個Set<Map.Entry<K, V>>

使用 Entry 的getKeygetValue來訪問鍵和值,並使用mapToIntsum

map.entrySet().stream()
        .filter(entry -> entry.getKey().startsWith(target))
        .mapToInt(Map.Entry::getValue)
        .sum();

map.entrySet().stream()為您提供Map.Entry<K, V>元素的 stream。

您應該使用e -> e.getKey().startsWith(target)來獲取鍵具有前綴作為值"target"的條目

Map.Entry::getValue為您提供過濾條目的值,以便您對這些值求和。

嘗試這個:

return map.entrySet().stream()
    .filter(e -> e.getKey().startsWith(target))
    .map(Map.Entry::getValue)
    .reduce(0, Integer::sum);

A Map.Entry是單個 object 不能被(k, v) ->...訪問。 您可以使用相應的方法getKey()getValue()獲取該條目的鍵和值,或者使用方法引用並收集值的總和:

int sum(Map<String, Integer> map, String target) {
    return map.entrySet().stream()
            .filter(e -> e.getKey().startsWith(target))
            // use a lamda expression and call the method
            .collect(Collectors.summingInt(e -> e.getValue()));
}

或使用方法參考

int sum(Map<String, Integer> map, String target) {
    return map.entrySet().stream()
            .filter(e -> e.getKey().startsWith(target))
            // use method reference
            .collect(Collectors.summingInt(Map.Entry::getValue));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM