使用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将收藏转换为地图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java开发者工具开源版_JArchit
- 下一篇: 安卓版微博看不了live(安卓版微博)