th:each嵌套_难题:嵌套的computeIfAbsent
th:each嵌套
总览
Java 8库在地图上有一个新方法,computeIfAbsent。 这是将地图转换为与键关联的对象的缓存的非常有用的方法。
但是,您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。
map.computeIfAbsent(Key.Hello, s -> {map.computeIfAbsent(Key.Hello, t -> 1);return 2;
});enum Key {Hello}
尽管这在简单的情况下看起来很奇怪,但是在更复杂的代码中,您可能会偶然地做到这一点(就像我今天下午所做的那样)那么会发生什么呢? 好吧,这取决于您使用的集合。
HashMap: {Hello=2}
WeakHashMap: {Hello=2}
TreeMap: {Hello=2}
IdentityHashMap: {Hello=2}
EnumMap: {Hello=2}
Hashtable: {Hello=2, Hello=1}
LinkedHashMap: {Hello=1, Hello=2}
ConcurrentSkipListMap: {Hello=1}
ConcurrentHashMap:
注意: ConcurrentHashMap永不返回。 它的锁定似乎没有重入。
ConcurrentSkipListMap具有最合理的结果,保留第一个添加的值。 对于这种不确定的情况,Hello = 2是合理的,如果令人困惑,因为它是第二个值而不是第一个值。 没有什么意义的是让唯一的不变键出现两次。
不幸的是,ConcurrentHashMap死锁本身很不幸,但至少不是那么微妙。
完整的代码。
public class A {public static void main(String[] args) {for (Map map : new Map[]{new HashMap<>(),new WeakHashMap<>(),new TreeMap<>(),new IdentityHashMap<>(),new EnumMap<>(Key.class),new Hashtable<>(),new LinkedHashMap<>(),new ConcurrentSkipListMap<>(),new ConcurrentHashMap<>()}) {System.out.print(map.getClass().getSimpleName() + ": ");map.computeIfAbsent(Key.Hello, s -> {map.computeIfAbsent(Key.Hello, t -> 1);return 2;});System.out.println(map);}}enum Key {Hello}
}
方法compute()具有相似的结果
HashMap: {Hello=null2}
WeakHashMap: {Hello=null2}
TreeMap: {Hello=null2}
IdentityHashMap: {Hello=null2}
EnumMap: {Hello=null2}
Hashtable: {Hello=null2, Hello=1}
LinkedHashMap: {Hello=1, Hello=null2}
ConcurrentSkipListMap: {Hello=12}
ConcurrentHashMap:
public class A {public static void main(String[] args) {for (Map map : new Map[]{new HashMap<>(),new WeakHashMap<>(),new TreeMap<>(),new IdentityHashMap<>(),new EnumMap<>(Key.class),new Hashtable<>(),new LinkedHashMap<>(),new ConcurrentSkipListMap<>(),new ConcurrentHashMap<>()}) {System.out.print(map.getClass().getSimpleName() + ": ");map.compute(Key.Hello, (s, v) -> {map.compute(Key.Hello, (s2, v2) -> "1");return v + "2";});System.out.println(map);}}enum Key {Hello}
}
结论
如果您要在lambda内部嵌套对地图的调用,则需要特别小心,或者完全避免这样做。 如果必须执行此操作,则ConcurrentSkipListMap似乎表现最佳。
翻译自: https://www.javacodegeeks.com/2015/05/puzzler-nested-computeifabsent.html
th:each嵌套
th:each嵌套_难题:嵌套的computeIfAbsent相关推荐
- for jq 嵌套_遍历嵌套列表 – jQuery
我正在使用jQuery进行一些DOM遍历,我试图在单击按钮时在#treeList中一次选择一个元素,但是一旦它通过第二个列表#innerList,它将选择该列表中的所有元素,点击继续列表.你怎么能像# ...
- Java树形转扁平_多层嵌套map对象转扁平化map
将深度嵌套的map对象转换为扁平化的map对象输出. import org.apache.commons.lang3.StringUtils; import java.util.HashMap; im ...
- mysql中的exists嵌套_基于mysql 的exists 嵌套查询的详解
select Sname from Student where not exists (select * from Course where not exists (select * from SC ...
- Android中RecyclerView嵌套RecyclerView或嵌套ListView
Android中RecyclerView嵌套RecyclerView或嵌套ListView
- lingo 嵌套@for或嵌套@sum
嵌套@for或嵌套@sum 对集合中的i单独求和,例如集合Xij,求Xi1+Xi2+Xi3-+Xin sets: r/1..5:y; c/1..5/:; link(r,c):x; endsets @f ...
- GlobalPointer:用统一的方式处理嵌套和非嵌套NER
©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 本文将介绍一个称为 GlobalPointer 的设计,它利用全局归一化的思路来进行命名实体识别(NER) ...
- AJPFX实例集合嵌套之ArrayList嵌套ArrayList
案例: package com.heima.list; import java.util.ArrayList; import java.util.Iterator; import com.heima. ...
- python多个if_Python之条件判断/if嵌套/如何写嵌套代码
一.条件判断 条件判断是计算机沟通的逻辑,其作用就是明确地让计算机知道:在什么条件下,该去做什么.对于Python也是同样.Python之所以能完成自动化任务,比如自动抓取网页关键词,自动下载小电影等 ...
- ElasticSearch使用(嵌套查询、嵌套高亮)
ElasticSearch使用(嵌套查询.嵌套高亮) 嵌套查询 bool 查询 must.should关系 1.只有must 2.只有should 3.must和should同时存在 4.怎样设置sh ...
最新文章
- 【webpack】-- 模块热替换
- 2017 Android 面试题 [ 基础与细节 ]
- HZOJ Drink
- 浪费超9000亿美金,数字化转型失败罪魁祸首在DevOps?
- 数学(FFT):BZOJ 3527 [Zjoi2014]力
- “假冒hao123”“北大青鸟”被黑 钓鱼挂马两不误
- 苏宁成立快递员节PK京东封杀快递,谁的做法更聪明?
- 自己开发个游戏其实挺简单(这是一个神奇的游戏-看透美女其实很容易)
- beatmaker3 android,faded打击垫
- rufus(u盘引导盘制作工具) v3.5.1497
- 智慧农业:各省市粮食产量排名,“鱼米之乡”湖南位居第十
- 2022年热传递与热物理国际研讨会(HTT 2022)
- TextMeshPro的超链接
- error in opening zip file
- STM32标准库工程中移植TencentOS-tiny
- 三峡学院计算机调剂,2018年重庆三峡学院考研预调剂信息公布
- 优享短视频训练营:这些好用的视频剪辑APP,你知道吗?
- 人生苦短_人生苦短,懂事太晚!
- Google Play In-app Billing
- 第三方支付平台BeeCloud