国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《Java8實戰(zhàn)》第8章 Collection API 的增強功能

這篇具有很好參考價值的文章主要介紹了《Java8實戰(zhàn)》第8章 Collection API 的增強功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

8.1 集合工廠

如果我想創(chuàng)建一個集合,之前的做法是先new一個list,然后再一個個的add,這樣子有點繁瑣。
現(xiàn)在的方法可以這樣,是使用 Arrays.asList()工廠方法:
List<String> friends = Arrays.asList("Raphael", "Olivia", "Thibaut");
但是這樣子創(chuàng)建只能更新,不可以增加、刪除。

8.1.1 List 工廠

工廠方法 List.of方法,創(chuàng)建的是一個只讀的列表。
它可以保護你的集合,以免被意外地修改。
建議是除非你需要進行某種形式的數(shù)據(jù)處理并對數(shù)據(jù)進行轉(zhuǎn)換,否則應(yīng)該盡量使用工廠方法。工廠方法使用起來更簡單,實現(xiàn)也更容易,并且在大多數(shù)情況下就夠用了。

8.1.2 Set 工廠

創(chuàng)建一個set集合 Set.of
Set<String> friends = Set.of("Raphael", "Olivia", "Thibaut");

8.1.3 Map 工廠

與list、set相比,創(chuàng)建map稍顯復(fù)雜,因為你需要同時傳遞鍵和值。Java 9中提供了兩種初始化一個不可變 Map 的方式。
Map<String, Integer> ageOfFriends = Map.of("Raphael", 30, "Olivia", 25, "Thibaut", 26);
如果你只需要創(chuàng)建不到 10 個鍵值對的小型 Map,那么使用這種方法比較方便。
規(guī)模比較大的話,就使用Map.ofEntries 的工廠方法,該工廠方法接受以變長參數(shù)列表形式組織的 Map.Entry<K, V>對象作為參數(shù)

import static java.util.Map.entry; 
Map<String, Integer> ageOfFriends 
       = Map.ofEntries(entry("Raphael", 30), 
       entry("Olivia", 25), 
       entry("Thibaut", 26)); 
System.out.println(ageOfFriends); 

8.2 使用 List 和 Set

Java 8 在 List 和 Set 的接口中新引入了以下方法。

  • removeIf 移除集合中匹配指定謂詞的元素。實現(xiàn)了 List 和 Set 的所有類都提供了該方法(事實上,這個方法繼承自 Collection 接口)。
  • replaceAll 用于 List 接口中,它使用一個函數(shù)(UnaryOperator)替換元素。
  • sort 也用于 List 接口中,對列表自身的元素進行排序。
8.2.1 removeIf 方法

循環(huán)的時候remove就會拋異常,ConcurrentModificationException。因為在底層實現(xiàn)上,for-each 循環(huán)使用了一個迭代器對象,集合由兩個不同的對象管理著
一般解決這個問題就需要顯示的調(diào)用Iterator 對象,并通過它調(diào)用 remove()方法

for (Iterator<Transaction> iterator = transactions.iterator(); 
 iterator.hasNext(); ) { 
 Transaction transaction = iterator.next(); 
 if(Character.isDigit(transaction.getReferenceCode().charAt(0))) { 
    iterator.remove(); 
  } 
} 

不過這樣子的話,代碼就顯得繁瑣,所以就可以使用removeIf了,
transactions.**removeIf**(transaction -> Character.isDigit(transaction.getReferenceCode().charAt(0)));

8.2.2 replaceAll 方法

List 接口提供的 replaceAll 方法讓你可以使用一個新的元素替換列表中滿足要求的每個元素。
原來的方式:

referenceCodes.stream() 
 .map(code -> Character.toUpperCase(code.charAt(0)) + 
 code.substring(1)) 
 .collect(Collectors.toList()) 
 .forEach(System.out::println);
輸入: [a12, C14, b13] 
輸出: A12, C14, B13

或者
for (ListIterator<String> iterator = referenceCodes.listIterator(); iterator.hasNext(); ) { 
 String code = iterator.next(); 
 iterator.set(Character.toUpperCase(code.charAt(0)) + code.substring(1)); 
} 

現(xiàn)在可以這樣子:
referenceCodes.replaceAll(code -> Character.toUpperCase(code.charAt(0)) + code.substring(1));

8.3 使用 Map

Java 8 在 Map 接口中新引入了幾個默認(rèn)方法

8.3.1 forEach 方法

使用 Map.Entry<K, V>迭代器訪問 Map 集合中的每一個元素:

for(Map.Entry<String, Integer> entry: ageOfFriends.entrySet()) { 
 String friend = entry.getKey(); 
 Integer age = entry.getValue(); 
 System.out.println(friend + " is " + age + " years old"); 
} 

從 Java 8 開始,Map 接口開始支持 forEach 方法,該方法接受一個 BiConsumer,以 Map的鍵和值作為參數(shù)。
ageOfFriends.forEach((friend, age) -> System.out.println(friend + " is " + age + " years old"));

8.3.2 排序

Entry.comparingByValue 、Entry.comparingByKey這兩個可以幫助map排序

favouriteMovies 
 .entrySet() 
 .stream() 
 .sorted(Entry.comparingByKey()) 
 .forEachOrdered(System.out::println);
8.3.3 getOrDefault 方法

當(dāng)獲取的對象不存在的話,就返回一個默認(rèn)值
System.out.println(favouriteMovies.getOrDefault("Olivia", "Matrix"));
如果key為Olivia的值不存在,那么就返回"Matrix"

8.3.4 計算模式

就是如果key不存在,那么就執(zhí)行某個操作

  • computeIfAbsent——如果指定的鍵沒有對應(yīng)的值(沒有該鍵或者該鍵對應(yīng)的值是空),那么使用該鍵計算新的值,并將其添加到 Map 中;
  • computeIfPresent——如果指定的鍵在 Map 中存在,就計算該鍵的新值,并將其添加到 Map 中;
  • compute——使用指定的鍵計算新的值,并將其存儲到 Map 中。

computeIfAbsent 的一個應(yīng)用場景是緩存信息。
// 如果key不存在就執(zhí)行calculateDigest操作
lines.forEach(line -> dataToHash.computeIfAbsent(line, this::calculateDigest));
還有這個場景,

String friend = "Raphael"; 
List<String> movies = friendsToMovies.get(friend); 
if(movies == null) { 
 movies = new ArrayList<>(); 
 friendsToMovies.put(friend, movies); 
} 
movies.add("Star Wars"); 

優(yōu)化
friendsToMovies.computeIfAbsent("Raphael", name -> new ArrayList<>()) 
 .add("Star Wars");
8.3.5 刪除模式

java提供了一個重載方法的remove方法。
可能是這樣子刪除的:判斷map的key存在,再比較值是否相等,然后再刪除

String key = "Raphael"; 
String value = "Jack Reacher 2"; 
if (favouriteMovies.containsKey(key) && 
 Objects.equals(favouriteMovies.get(key), value)) { 
   favouriteMovies.remove(key); 
   return true; 
} else { 
 return false; 
}

現(xiàn)在這樣:
favouriteMovies.remove(key, value);
vlaue小于10就刪除
movies.entrySet().removeIf(entry -> entry.getValue() < 10);

8.3.6 替換模式

Map 中提供了兩種新的方法來替換其內(nèi)部映射項,分別是:

  • replaceAll——通過 BiFunction 替換 Map 中每個項的值。該方法的工作模式類似于之前介紹過的 List 的 replaceAll 方法;
  • Replace——如果鍵存在,就可以通過該方法替換 Map 中該鍵對應(yīng)的值。它是對原有replace 方法的重載,可以僅在原有鍵對應(yīng)某個特定的值時才進行替換。

movie 就是value
favouriteMovies.replaceAll((friend, movie) -> movie.toUpperCase());

8.3.7 merge 方法
Map<String, String> friends = Map.ofEntries(entry("Raphael", "Star Wars")); 
Map<String, String> everyone = new HashMap<>(family); 
everyone.putAll(friends); 
System.out.println(everyone); 

但是如果是有沖突的合并需要處理,可以這樣

Map<String, String> family = Map.ofEntries( 
 entry("Teo", "Star Wars"), entry("Cristina", "James Bond")); 
Map<String, String> friends = Map.ofEntries( 
 entry("Raphael", "Star Wars"), entry("Cristina", "Matrix")); 

Map<String, String> everyone = new HashMap<>(family); 
friends.forEach((k, v) -> 
 everyone.merge(k, v, (movie1, movie2) -> movie1 + " & " + movie2)); // 如果存在重復(fù)的鍵,就連接兩個值
System.out.println(everyone); 

merge 方法處理空值的方法相當(dāng)復(fù)雜,在 Javadoc 文檔中是這么描述的:
如果指定的鍵并沒有關(guān)聯(lián)值,或者關(guān)聯(lián)的是一個空值,那么[merge]會將它關(guān)聯(lián)到指定的非空值。否則,[merge]會用給定映射函數(shù)的[返回值]替換該值,如果映射函數(shù)的返回值為空就刪除[該鍵]。

8.4 改進的 ConcurrentHashMap

并發(fā)安全,使用的是分段鎖

8.4.1 歸約和搜索

ConcurrentHashMap 類支持三種新的操作

  • forEach——對每個(鍵, 值)對執(zhí)行指定的操作;
  • reduce——依據(jù)歸約函數(shù)整合所有(鍵, 值)對的計算結(jié)果;
  • search——對每個(鍵, 值)對執(zhí)行一個函數(shù),直到函數(shù)取得一個非空值。

每種操作支持四種形式的參數(shù),接受函數(shù)使用鍵、值、Map.Entry 以及(鍵, 值)對作為參數(shù):

  • 使用鍵(forEachKey,reduceKeys,searchKeys);
  • 使用值(forEachValue,reduceValues,searchValues);
  • 使用 Map.Entry 對象(forEachEntry,reduceEntries,searchEntries);
  • 使用鍵和值(forEach,reduce,search)。
ConcurrentHashMap<String, Long> map = new ConcurrentHashMap<>(); 
long parallelismThreshold = 1; 
Optional<Integer> maxValue = 
 Optional.ofNullable(map.reduceValues(parallelismThreshold, Long::max)); 
8.4.2 計數(shù)

ConcurrentHashMap 類提供了一個新的 mappingCount 方法,能以長整形 long 返回 Map中的映射數(shù)目。你應(yīng)該盡量在新的代碼中使用它,而不是繼續(xù)使用返回 int 的 size 方法。

8.4.3 Set 視圖

ConcurrentHashMap 類還提供了一個新的 keySet 方法,該方法以 Set 的形式返回ConcurrentHashMap 的一個視圖(Map 中的變化會反映在返回的 Set 中,反之亦然)。
文章來源地址http://www.zghlxwxcb.cn/news/detail-423207.html

8.5 小結(jié)

  • Java 9 支持集合工廠,使用 List.of、Set.of、Map.of 以及 Map.ofEntries 可以創(chuàng)建小型不可變的 List、Set 和 Map。
  • 集合工廠返回的對象都是不可變的,這意味著創(chuàng)建之后你不能修改它們的狀態(tài)。
  • List 接口支持默認(rèn)方法 removeIf、replaceAll 和 sort。
  • Set 接口支持默認(rèn)方法 removeIf。
  • Map 接口為常見模式提供了幾種新的默認(rèn)方法,并降低了出現(xiàn)缺陷的概率。
  • ConcurrentHashMap 支持從 Map 中繼承的新默認(rèn)方法,并提供了線程安全的實現(xiàn)。

到了這里,關(guān)于《Java8實戰(zhàn)》第8章 Collection API 的增強功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java筆記(15) Collection集合-->List集合

    Java筆記(15) Collection集合-->List集合

    集合的理解和好處 數(shù)組一旦定義,長度即固定,不能修改。要添加新元素需要新建數(shù)組,然后循環(huán)拷貝,非常麻煩 集合可以動態(tài)保存任意多個對象,使用比較方便 提供餓了一系列方便的操作對象的方法:add、remove、set、get等 使用集合添加、刪除新元素的示意代碼,簡潔明了

    2023年04月14日
    瀏覽(21)
  • Java筆記(16) Collection集合-->Set集合-->HashSet

    Java筆記(16) Collection集合-->Set集合-->HashSet

    Set是無序集合(添加和取出的順序不一致,但取出的順序是固定的),沒有索引 不允許重復(fù)元素,所以最多包含一個null JDK API中Set接口的實現(xiàn)類有: Abstract, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet Set接口和List接口一

    2023年04月15日
    瀏覽(28)
  • 【Java集合進階】Collection 體系集合詳解(ArrayList,LinkedList,HashSet,TreeSet...)
  • 【從零開始學(xué)Java66】講解Java集合中的Collection體系

    【從零開始學(xué)Java66】講解Java集合中的Collection體系

    本文將為大家詳細(xì)講解Java中的Collection體系,這是我們進行開發(fā)時經(jīng)常用到的知識點,也是大家在學(xué)習(xí)Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題。 文章較長,干貨滿滿,建議大家收藏慢慢學(xué)習(xí)。文末有本文重點總結(jié),主頁有全系列文章分享。技術(shù)類問

    2024年02月06日
    瀏覽(24)
  • 49天精通Java,第23天,Java集合,Collection接口,Iterator接口

    49天精通Java,第23天,Java集合,Collection接口,Iterator接口

    大家好,我是哪吒。 在Java類庫中,集合類的基類是Collection接口。

    2023年04月11日
    瀏覽(21)
  • Java基礎(chǔ)六 - Collection集合List、Set、Queue,Map

    1. List - ArrayList、LinkedList、Vector ArrayList ????????2. LinkedList ????????3.?Vector ????????4. 常見使用方法 2. Set - HashSet、LinkedHashSet、TreeSet 1.?HashSet 2. LinkedHashSet 3. TreeSet 4. 常用方法 3. Map -?HashMap、TreeMap、LinkedHashMap、Hashtable 1.?HashMap 2.?LinkedHashMap 3.?TreeMap 4.?Hashtable 5.

    2024年02月14日
    瀏覽(28)
  • 從零開始學(xué)習(xí) Java:簡單易懂的入門指南之Collection集合及l(fā)ist集合(二十一)

    從零開始學(xué)習(xí) Java:簡單易懂的入門指南之Collection集合及l(fā)ist集合(二十一)

    1.1數(shù)組和集合的區(qū)別 相同點 都是容器,可以存儲多個數(shù)據(jù) 不同點 數(shù)組的長度是不可變的,集合的長度是可變的 數(shù)組可以存基本數(shù)據(jù)類型和引用數(shù)據(jù)類型 集合只能存引用數(shù)據(jù)類型,如果要存基本數(shù)據(jù)類型,需要存對應(yīng)的包裝類 1.2集合類體系結(jié)構(gòu) 1.3Collection 集合概述和使用 Collec

    2024年02月10日
    瀏覽(22)
  • Java8 - 將 List 集合轉(zhuǎn)為 Map

    1. 將List轉(zhuǎn)為Map:key=userId, value=name 輸出: 2. 將List轉(zhuǎn)為Map:key=userId, value=User對象 輸出: 3. 重復(fù)的 key 處理 如果出現(xiàn)相同的key,那么會拋出重復(fù)key的異常,比如我們將userId為3的修改為2,則會和第二個用戶沖突: 拋出異常: Collectors.toMap支持第三個參數(shù),對重復(fù)值進行選?。?/p>

    2024年02月08日
    瀏覽(111)
  • 【JAVA學(xué)習(xí)筆記】 56 - 開發(fā)中如何選擇集合實現(xiàn)類,以及Collection工具類

    https://github.com/yinhai1114/Java_Learning_Code/blob/main/IDEA_Chapter14/src/com/yinhai/Collections_.java 目錄 項目代碼 Collections工具類 一、Collections工具類介紹 1.排序操作: (均為static方法) 2.查找、替換 在開發(fā)中,選擇什么集合實現(xiàn)類,主要取決于業(yè)務(wù)操作特點,然后根據(jù)集合實現(xiàn)類特性進行 選擇

    2024年02月06日
    瀏覽(33)
  • 【JAVA學(xué)習(xí)筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    【JAVA學(xué)習(xí)筆記】53 - 集合-List類及其子類Collection、ArrayList、LinkedList類

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/collection_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/list_ 目錄 項目代碼 集合 一、引入 數(shù)組 集合 二、集合的框架體系 單列集合? ? ? ? 雙列集合? ? ? ? Collection類 一、Collection類接

    2024年02月06日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包