J.J*_*eam 11 collections java-8
似乎合并和计算 Map 方法都被创建来减少 if("~key exists here~") 放置时。我的问题是:当我什么都不知道时添加到映射 [key, value] 对:map 中既不存在键也不存在但具有 value 或 value == null 或 key == null。
words.forEach(word ->
map.compute(word, (w, prev) -> prev != null ? prev + 1 : 1)
);
words.forEach(word ->
map.merge(word, 1, (prev, one) -> prev + one)
);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是 1 从 Bifunction 移到了参数吗?什么更好用?是否有任何合并、计算表明 key/val 存在?它们的用例有什么本质区别?
Sla*_*law 11
的文档Map#compute(K, BiFunction)说:
尝试计算指定键及其当前映射值的映射(或者
null如果没有当前映射)。例如,要创建或附加Stringmsg一个值映射:Run Code Online (Sandbox Code Playgroud)map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))(
merge()用于此类目的的方法通常更简单。)如果重映射函数返回
null,则删除映射(如果最初不存在,则保持不存在)。如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。重新映射函数不应在计算期间修改此映射。
和文档Map#merge(K, V, BiFunction)说:
如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。否则,用给定重映射函数的结果替换关联的值,如果结果为 ,则删除
null。当为一个键组合多个映射值时,此方法可能有用。例如,要创建或附加Stringmsg一个值映射:Run Code Online (Sandbox Code Playgroud)map.merge(key, msg, String::concat)如果重映射函数返回
null,则删除映射。如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。重新映射函数不应在计算期间修改此映射。
重要的区别是:
对于compute(K, BiFunction<? super K, ? super V, ? extends V>):
BiFunction是始终调用。BiFunction接受给定的密钥和当前值,如果有的话,作为参数,并返回一个新值。对于merge(K, V, BiFunction<? super V, ? super V, ? extends V>):
BiFunction调用仅在给定密钥已与非空值相关联。BiFunction接受当前值与给定值作为参数,并返回一个新值。与 不同compute,BiFunction没有给出密钥。| 归档时间: |
|
| 查看次数: |
2882 次 |
| 最近记录: |