![](/img/trans.png)
[英]How to work with a generic map whose key and values belong to a certain hierarchy?
[英]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<>
的集合,沒有單獨的k
和v
。 你應該嘗試這樣的事情:
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 的getKey
和getValue
來訪問鍵和值,並使用mapToInt
和sum
。
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.