th:each嵌套_难题:嵌套的computeIfAbsent
th:each嵌套
總覽
Java 8庫在地圖上有一個(gè)新方法,computeIfAbsent。 這是將地圖轉(zhuǎn)換為與鍵關(guān)聯(lián)的對(duì)象的緩存的非常有用的方法。
但是,您可能沒有考慮過一種組合。 如果您在內(nèi)部調(diào)用computeIfAbsent會(huì)發(fā)生什么。
map.computeIfAbsent(Key.Hello, s -> {map.computeIfAbsent(Key.Hello, t -> 1);return 2; });enum Key {Hello}盡管這在簡(jiǎn)單的情況下看起來很奇怪,但是在更復(fù)雜的代碼中,您可能會(huì)偶然地做到這一點(diǎn)(就像我今天下午所做的那樣)那么會(huì)發(fā)生什么呢? 好吧,這取決于您使用的集合。
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具有最合理的結(jié)果,保留第一個(gè)添加的值。 對(duì)于這種不確定的情況,Hello = 2是合理的,如果令人困惑,因?yàn)樗堑诙€(gè)值而不是第一個(gè)值。 沒有什么意義的是讓唯一的不變鍵出現(xiàn)兩次。
不幸的是,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()具有相似的結(jié)果
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} }結(jié)論
如果您要在lambda內(nèi)部嵌套對(duì)地圖的調(diào)用,則需要特別小心,或者完全避免這樣做。 如果必須執(zhí)行此操作,則ConcurrentSkipListMap似乎表現(xiàn)最佳。
翻譯自: https://www.javacodegeeks.com/2015/05/puzzler-nested-computeifabsent.html
th:each嵌套
總結(jié)
以上是生活随笔為你收集整理的th:each嵌套_难题:嵌套的computeIfAbsent的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 格鲁吉亚是位于哪个国家的城市(格鲁吉亚人
- 下一篇: 安卓模拟器上网能被单位查到吗(安卓模拟器