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相关推荐

  1. for jq 嵌套_遍历嵌套列表 – jQuery

    我正在使用jQuery进行一些DOM遍历,我试图在单击按钮时在#treeList中一次选择一个元素,但是一旦它通过第二个列表#innerList,它将选择该列表中的所有元素,点击继续列表.你怎么能像# ...

  2. Java树形转扁平_多层嵌套map对象转扁平化map

    将深度嵌套的map对象转换为扁平化的map对象输出. import org.apache.commons.lang3.StringUtils; import java.util.HashMap; im ...

  3. mysql中的exists嵌套_基于mysql 的exists 嵌套查询的详解

    select Sname from Student where not exists (select * from Course where not exists (select * from SC ...

  4. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  5. 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 ...

  6. GlobalPointer:用统一的方式处理嵌套和非嵌套NER

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 本文将介绍一个称为 GlobalPointer 的设计,它利用全局归一化的思路来进行命名实体识别(NER) ...

  7. AJPFX实例集合嵌套之ArrayList嵌套ArrayList

    案例: package com.heima.list; import java.util.ArrayList; import java.util.Iterator; import com.heima. ...

  8. python多个if_Python之条件判断/if嵌套/如何写嵌套代码

    一.条件判断 条件判断是计算机沟通的逻辑,其作用就是明确地让计算机知道:在什么条件下,该去做什么.对于Python也是同样.Python之所以能完成自动化任务,比如自动抓取网页关键词,自动下载小电影等 ...

  9. ElasticSearch使用(嵌套查询、嵌套高亮)

    ElasticSearch使用(嵌套查询.嵌套高亮) 嵌套查询 bool 查询 must.should关系 1.只有must 2.只有should 3.must和should同时存在 4.怎样设置sh ...

最新文章

  1. 【webpack】-- 模块热替换
  2. 2017 Android 面试题 [ 基础与细节 ]
  3. HZOJ Drink
  4. 浪费超9000亿美金,数字化转型失败罪魁祸首在DevOps?
  5. 数学(FFT):BZOJ 3527 [Zjoi2014]力
  6. “假冒hao123”“北大青鸟”被黑 钓鱼挂马两不误
  7. 苏宁成立快递员节PK京东封杀快递,谁的做法更聪明?
  8. 自己开发个游戏其实挺简单(这是一个神奇的游戏-看透美女其实很容易)
  9. beatmaker3 android,faded打击垫
  10. rufus(u盘引导盘制作工具) v3.5.1497
  11. 智慧农业:各省市粮食产量排名,“鱼米之乡”湖南位居第十
  12. 2022年热传递与热物理国际研讨会(HTT 2022)
  13. TextMeshPro的超链接
  14. error in opening zip file
  15. STM32标准库工程中移植TencentOS-tiny
  16. 三峡学院计算机调剂,2018年重庆三峡学院考研预调剂信息公布
  17. 优享短视频训练营:这些好用的视频剪辑APP,你知道吗?
  18. 人生苦短_人生苦短,懂事太晚!
  19. Google Play In-app Billing
  20. 第三方支付平台BeeCloud

热门文章

  1. ssl1257-产生数【图论,最短路】
  2. ACM-ICPC中博弈论的一些小小总结
  3. 阿里微服务架构下分布式事务Seata
  4. 谈谈 Java 的克隆
  5. Java Jar包的压缩、解压使用指南
  6. forEach和for in
  7. 点滴小组KTV点歌系统简介
  8. 常用的字符串加密解密工具类
  9. Ajax基本案例详解之$.ajax的实现
  10. CV中多的空格导致报错