成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你只會用 map.put?試試 Java 8 compute ,操作 Map 更輕松!

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

 [[424111]]

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

compute簡介

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

這三個方法的區別:

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

compute有啥用?

話說這有什么卵用?

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

  1. /**  
  2. * 公眾號:Java技術棧  
  3. */  
  4. private static void preJava8() {  
  5.     List<String> animals = Arrays.asList("dog", "cat", "cat", "dog", "fish", "dog");  
  6.     Map<String, Integer> 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}

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

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

Java 8 compute 實現方式: 

  1. /**  
  2. * 公眾號:Java技術棧  
  3. */  
  4. private static void inJava8() {  
  5.     List<String> animals = Arrays.asList("dog", "cat", "cat", "dog", "fish", "dog");  
  6.     Map<String, Integer> 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源碼分析

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

  1. /**  
  2. * 公眾號:Java技術棧  
  3. */  
  4. default V compute(K key,  
  5.         BiFunction<? super K, ? super V, ? extends V> remappingFunction) {       
  6.      // 函數式接口不能為空    
  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.     }  

實現邏輯其實也很簡單,其實就是結合了 Java 8 的函數式編程讓代碼變得更簡單了,Java 也越來越聰明了。

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

本節教程所有實戰源碼已上傳到這個倉庫:

https://github.com/javastacks/javastack

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

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2024-11-08 13:24:43

2021-11-30 10:38:09

splitStringTokenJava

2022-04-28 21:53:52

TypeScriptany類型

2020-04-27 20:55:42

JavaJava 8編程語言

2024-07-10 11:40:15

2010-12-23 15:55:00

上網行為管理

2020-06-28 16:07:03

HomebrewMacLinux

2022-11-07 17:50:36

2024-01-11 11:51:51

Rustmap數據結構

2023-12-01 15:46:01

Kubernetes容器

2019-06-03 10:50:14

人工智能Java編程

2020-03-06 10:25:10

注解Java代碼

2009-12-23 15:41:26

2023-06-02 15:53:38

工具Python開發

2022-11-07 16:25:07

JavaScript技巧

2009-05-20 14:43:38

ibmdwEasyMock測試

2011-01-19 10:42:15

2015-06-01 10:48:00

虛擬機云計算云就緒

2017-03-17 17:36:50

互聯網

2023-07-04 13:35:00

Monorepos工具管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人一区二区视频 | 欧美午夜一区 | 91资源在线 | 久久久久国产一区二区三区四区 | 亚洲免费在线观看 | 国产精品久久在线 | 亚洲天堂久久新 | h片在线看 | 日韩一级电影免费观看 | 伊人久久综合 | 亚洲网址在线观看 | 色婷婷综合久久久中字幕精品久久 | 在线视频中文字幕 | 欧美一区二不卡视频 | 自拍偷拍亚洲视频 | 91不卡在线| 午夜男人天堂 | 精国产品一区二区三区四季综 | 日一区二区三区 | 久久免费观看一级毛片 | 国产 日韩 欧美 中文 在线播放 | 日本福利视频 | 国产一区二区在线免费播放 | 超碰97免费在线 | 日本中文在线 | av片免费观看 | 国产亚洲人成a在线v网站 | 色综合天天天天做夜夜夜夜做 | 99re在线免费视频 | 在线视频亚洲 | 男女免费观看在线爽爽爽视频 | 亚洲免费人成在线视频观看 | 国产偷录视频叫床高潮对白 | 五月激情婷婷在线 | 欧美日韩综合精品 | 亚洲精品国产电影 | 色毛片 | 性色av网站| 欧美激情精品久久久久久 | 亚洲一卡二卡 | 成人在线电影在线观看 |