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()方法之一(通常比顺序迭代更可取的归约运算符 ),然后将其传递给通过预定义的toMap( )提供的Collector接口的实现。 )来自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 时区 转换