日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你只會用map.put?試試Java8compute,操作Map更輕松!

今天棧長分享一個實用的 Java 8 開發(fā)技能,那就是 Map 接口中增加的 compute 方法,給 Map 集合計算更新用的。

只為您設(shè)計更接底氣、較有營銷力的好網(wǎng)站,將營銷策劃與網(wǎng)頁設(shè)計互相結(jié)合的專業(yè)機構(gòu),網(wǎng)絡(luò)營銷推廣公司中較早掌握H5建站技術(shù)的機構(gòu)。一個好的成都品牌網(wǎng)站建設(shè),不能只是一張名片,茫茫網(wǎng)海,想要快速吸引到您客戶的眼球,必須全方位的展現(xiàn)出企業(yè)突出的優(yōu)勢,以求達到主動營銷的效果,最終促成成交!

compute簡介

如下所示,Java 8 在 Map 和 ConcurrentMap 接口中都增加了 3 個 compute 方法,說明也是支持多線程并發(fā)安全操作的。

這三個方法的區(qū)別:

  •  compute:計算并更新值
  •  computeIfAbsent:Value不存在時才計算
  •  computeIfPresent:Value存在時才計算

compute有啥用?

話說這有什么卵用?

先看看沒用 Java 8 的一個小示例: 

 
 
 
 
  1. /**  
  2. * 公眾號:Java技術(shù)棧  
  3. */  
  4. private static void preJava8() {  
  5.     List animals = Arrays.asList("dog", "cat", "cat", "dog", "fish", "dog");  
  6.     Map map = new HashMap<>();  
  7.     for(String animal : animals){  
  8.         Integer count = map.get(animal);  
  9.         map.put(animal, count == null ? 1 : ++count);  
  10.     }  
  11.     System.out.println(map);  

輸出:

{cat=2, fish=1, dog=3}

這是一個統(tǒng)計一個列表中每個動物的數(shù)量,代碼再怎么精簡都需要一步 get 操作,判斷集合中是否有元素再確定是初始化:1,還是需要 +1。

很多時候,這個 get 操作顯然是毫無必要的,所以 Java 8 提供了 3 個 compute 方法,來看看怎么用吧!

Java 8 compute 實現(xiàn)方式: 

 
 
 
 
  1. /**  
  2. * 公眾號:Java技術(shù)棧  
  3. */  
  4. private static void inJava8() {  
  5.     List animals = Arrays.asList("dog", "cat", "cat", "dog", "fish", "dog");  
  6.     Map map = new HashMap<>();  
  7.     for(String animal : animals){  
  8.         map.compute(animal, (k, v) -> v == null ? 1 : ++v);  
  9.     }  
  10.     System.out.println(map);  

使用 compute 方法一行搞定,省去了需要使用 get 取值再判斷的冗余操作,直接就可以獲取元素值并計算更新,是不是很方便呢?

compute源碼分析

這還是一個默認(rèn)方法,為什么是默認(rèn)方法,也是為了不改動其所有實現(xiàn)類,關(guān)于默認(rèn)方法的定義可以關(guān)注公眾號Java技術(shù)棧獲取 Java 8+ 系列教程。 

 
 
 
 
  1. /**  
  2. * 公眾號:Java技術(shù)棧  
  3. */  
  4. default V compute(K key,  
  5.         BiFunction remappingFunction) {       
  6.      // 函數(shù)式接口不能為空    
  7.     Objects.requireNonNull(remappingFunction);   
  8.      // 獲取舊值  
  9.     V oldValue = get(key); 
  10.      // 獲取計算的新值  
  11.     V newValue = remappingFunction.apply(key, oldValue);    
  12.      if (newValue == null) { // 新值為空  
  13.         // delete mapping  
  14.         if (oldValue != null || containsKey(key)) { // 舊值存在時  
  15.             // 移除該鍵值  
  16.             remove(key);  
  17.             return null;  
  18.         } else {  
  19.             // nothing to do. Leave things as they were.  
  20.             return null;  
  21.         }  
  22.     } else { // 新值不為空  
  23.         // 添加或者覆蓋舊值  
  24.         put(key, newValue);  
  25.         return newValue;  
  26.     }  

實現(xiàn)邏輯其實也很簡單,其實就是結(jié)合了 Java 8 的函數(shù)式編程讓代碼變得更簡單了,Java 也越來越聰明了。

另外兩個方法我就不演示了,在特定的場合肯定也肯定特別有用,大家知道就好,需要的時候要知道拿來用。

本節(jié)教程所有實戰(zhàn)源碼已上傳到這個倉庫:

https://github.com/javastacks/javastack

本次的分享就到這里了,希望對大家有用。覺得不錯,在看、轉(zhuǎn)發(fā)分享一下哦~


當(dāng)前名稱:你只會用map.put?試試Java8compute,操作Map更輕松!
當(dāng)前地址:http://www.5511xx.com/article/dhiijcp.html