日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用JDK 8将收藏转换为地图

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JDK 8将收藏转换为地图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我多次遇到這樣的情況,希望將多個對象存儲在Map中而不是Set或List中,因為將唯一標識信息的Map應用于對象有一些優勢 。 Java 8使用流和Collectors.toMap(…)方法使翻譯變得比以往更加容易。

使用Map而不是Set的一種有用情況是,當處理缺少或具有粗略的equals(Object)或hashCode()實現但具有唯一標識對象的字段的對象時。 在那些情況下,如果我無法添加或修復對象的基礎實現,則可以通過使用類(鍵)的唯一標識字段到類的實例化對象(值)的Map來獲得更好的唯一性保證。 當我更喜歡使用“ Map到List或“ Set時,更常見的情況是需要通過特定的唯一標識字段在集合中查找項目。 在唯一標識鍵上進行映射查找的速度快,而且通常比依賴迭代和將每個對象的調用與equals(Object)方法進行比較要快得多。

使用JDK 8,從現有的List或Set構造Map變得比以往更加容易。 為了說明這一點,將使用一個簡單的Book類。 這Book類沒有重載equals(Object)或hashCode()從Object類,因此是不恰當的類中使用Set或作為Map的關鍵。 但是,其getIsbn()方法返回一個國際標準書號 ,在本演示中,該書號被認為是唯一的。

Book.java

package dustin.examples.jdk8;/*** Represents a book, but does not override {@code equals(Object)}* or {@code hashCode()}.*/ public class Book {/** International Standard Book Number (ISBN-13). */final String isbn;/** Title of book. */final String title;/** Edition of book. */final int edition;/*** Constructor.** @param newIsbn International Standard Book Number (-13).* @param newTitle Title.* @param newEdition Edition.*/public Book(final String newIsbn, final String newTitle, final int newEdition){isbn = newIsbn;title = newTitle;edition = newEdition;}/*** Provide ISBN-13 identifier associated with this book.** @return ISBN-13 identifier.*/public String getIsbn(){return isbn;}/*** Provide title of this book.** @return Book's title.*/public String getTitle(){return title;}/*** Provide edition of this book.** @return Book's edition.*/public int getEdition(){return edition;}@Overridepublic String toString(){return title + " (Edition " + edition + ") - ISBN-13: " + isbn;} }

放置好該類之后,演示類CollectionToMapDemo演示了使用JDK 8將各種Java集合類型( Set , List甚至數組)轉換為Map是多么容易。

CollectionToMapDemo.java

package dustin.examples.jdk8;import static java.lang.System.out;import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors;/*** Demonstrates conversion of Java collections to Java Maps.*/ public class CollectionToMapDemo {/*** Multiple instances of Book, a class that lacks a proper* equals(Object) method, but for which its getIsbn() method* is assumed to return a unique identifier for each instance.*/private static final Book[] books;static{books = new Book[]{new Book("978-0-201-31005-4", "Effective Java", 1),new Book("978-0-321-35668-0", "Effective Java", 2),new Book("978-0-13-468599-1", "Effective Java", 3)};}/*** Convert provided array of Book instances to Map of each Book's ISBN to* that instance of the Book.* * @param booksArray Array of Book instances.* @return Map of each book's ISBN (key) to the book's full instance (value).*/private static Map<String, Book> convertArrayToMap(final Book[] booksArray){return Arrays.stream(books).collect(Collectors.toMap(Book::getIsbn, book -> book));}/*** Convert provided List of Book instances to Map of each Book's ISBN to* that instance of the Book.** @param booksList List of Book instances.* @return Map of each book's ISBN (key) to the book's full instance (value).*/private static Map<String, Book> convertListToMap(final List<Book> booksList){return booksList.stream().collect(Collectors.toMap(Book::getIsbn, book -> book));}/*** Convert provided Set of Book instances to Map of each Book's ISBN to* that instance of the Book.** @param booksSet Set of Book instances.* @return Map of each book's ISBN (key) to the book's full instance (value).*/private static Map<String, Book> convertSetToMap(final Set<Book> booksSet){return booksSet.stream().collect(Collectors.toMap(Book::getIsbn, book -> book));}public static void main(final String[] arguments){out.println("ARRAY->MAP:\n" + convertArrayToMap(books));final List<Book> booksList = Arrays.asList(books);out.println("LIST->MAP:\n" + convertListToMap(booksList));final Set<Book> booksSet= new HashSet<>(Arrays.stream(books).collect(Collectors.toSet()));out.println("SET->MAP:\n" + convertSetToMap(booksSet));} }

剛顯示的類列表中最重要的方法是convertArrayToMap(Book[]) , convertListToMap(List<Book>)和convertSetToMap(Set<Book>) 。 一旦訪問了基于基礎Set , List或array的流,所有這三種實現都是相同的。 在所有這三種情況下,僅需使用流的collect()方法之一(通常比順序迭代更可取的歸約運算符 ),然后將其傳遞給Collector接口的實現,該實現是通過預定義的toMap( )來自Collectors類的Collector 。

接下來顯示針對Book實例運行此演示類的輸出:

ARRAY->MAP: {978-0-201-31005-4=Effective Java (Edition 1) - ISBN-13: 978-0-201-31005-4, 978-0-321-35668-0=Effective Java (Edition 2) - ISBN-13: 978-0-321-35668-0, 978-0-13-468599-1=Effective Java (Edition 3) - ISBN-13: 978-0-13-468599-1} LIST->MAP: {978-0-201-31005-4=Effective Java (Edition 1) - ISBN-13: 978-0-201-31005-4, 978-0-321-35668-0=Effective Java (Edition 2) - ISBN-13: 978-0-321-35668-0, 978-0-13-468599-1=Effective Java (Edition 3) - ISBN-13: 978-0-13-468599-1} SET->MAP: {978-0-201-31005-4=Effective Java (Edition 1) - ISBN-13: 978-0-201-31005-4, 978-0-321-35668-0=Effective Java (Edition 2) - ISBN-13: 978-0-321-35668-0, 978-0-13-468599-1=Effective Java (Edition 3) - ISBN-13: 978-0-13-468599-1}

我遇到過幾種情況,在這種情況下,在唯一標識符Map中包含多個對象到這些對象的完整實例是有利的,但是在Set , List或數組中給了這些對象。 盡管在Java中將這些Set , List和數組轉換為Map從未特別困難,但在Java 8中進行這種轉換比以往更加容易。

翻譯自: https://www.javacodegeeks.com/2018/01/converting-collections-maps-jdk-8.html

總結

以上是生活随笔為你收集整理的使用JDK 8将收藏转换为地图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。