在 Java 中将列表转换为 map
- 使用 ArrayList 和 HashMap 将 List 转换为 Map
-
在 Java 中使用
Stream
和Collectors
将列表转换为 map - 在 Java 中使用排序和收集将列表转换为 map
List
允许维护有序的对象集合。Map
对象将键映射到值。在 Java 中,有几种方法可以将对象的 List
转换为 Map
。在本文中,我们将学习其中的一些。
使用 ArrayList 和 HashMap 将 List 转换为 Map
Java 中的 List
接口允许对象的有序集合,并存储重复值。它提供了基于索引的方法来更新、删除、插入和搜索元素。我们还可以在 List
中存储空值。ArrayList
、LinkedList
是一些实现 List
接口的类。
Java 中的 Map
接口将唯一键映射到值,并且不能包含重复键。它具有基于该唯一键搜索、更新和插入元素的有用方法。HashMap
类实现 Map
接口。
Book
类具有三个成员变量 bookName
、author
、id
和这些属性的 getter 方法。我们重写了 toString()
方法来格式化 Book
类数据。Book
类的对象被创建。List
接口的 add()
方法将对象插入 bookList
。
我们使用 HashMap
类创建一个 Map
对象,该类保存 Integer
类型的键和 Book
类型的值。我们使用增强的 for
循环,其中我们使用 put()
方法并将 bookList
中的所有 Book
数据添加到 map 中。
put()
方法有两个参数。我们通过调用 getId()
访问 id
属性并将其用作键并将书类对象 b
存储为该特定键的值。我们可以打印 bookMap
对象,如输出所示。
class Book {
int id;
String bookName;
String author;
public Book(int id, String bookName, String author) {
this.id = id;
this.bookName = bookName;
this.author = author;
}
public int getId() {
return id;
}
public String getAuthor() {
return author;
}
public String getBookName() {
return bookName;
}
@Override
public String toString() {
return "Book{"
+ " bookName='" + bookName + '\'' + ", author='" + author + '\'' + '}';
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
List<Book> bookList = new ArrayList<>();
bookList.add(new Book(1, "Barney's Version", "Mordecai Richler"));
bookList.add(new Book(2, "The Unsettlers", "Mark Sundeen"));
bookList.add(new Book(3, "The Debt to Pleasure", "John Lanchester"));
Map<Integer, Book> bookMap = new HashMap();
for (Book b : bookList) {
bookMap.put(b.getId(), b);
}
System.out.println("BookMap " + bookMap.toString());
}
}
输出:
BookMap {1=Book{ bookName="Barney's Version", author='Mordecai Richler'}, 2=Book{ bookName='The Unsettlers', author='Mark Sundeen'}, 3=Book{ bookName='The Debt to Pleasure', author='John Lanchester'}}
在 Java 中使用 Stream
和 Collectors
将列表转换为 map
在 Java 8 中使用带有 Stream
和 Collectors
的 lambda 函数很容易实现上述任务。stream() 方法从 bookList
返回 Book
类对象的 Stream
。
为了收集这些元素,我们使用 Stream
类的 collect()
方法。元素将被收集在一个 map 中,所以我们使用了这个 Collectors.toMap()
。键是 id
并将 Book
对象存储为值。通过打印 result1
作为输出,我们可以看到我们将 bookList
转换为 Map。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
List<Book> bookList = new ArrayList<>();
bookList.add(new Book(1, "Barney's Version", "Mordecai Richler"));
bookList.add(new Book(2, "The Unsettlers", "Mark Sundeen"));
bookList.add(new Book(3, "The Debt to Pleasure", "John Lanchester"));
Map<Integer, String> result1 =
bookList.stream().collect(Collectors.toMap(Book::getId, Book::toString));
System.out.println("Result 1 : " + result1);
}
}
输出:
Result 1 : {1=Book{ bookName="Barney's Version", author='Mordecai Richler'}, 2=Book{ bookName='The Unsettlers', author='Mark Sundeen'}, 3=Book{ bookName='The Debt to Pleasure', author='John Lanchester'}}
在 Java 中使用排序和收集将列表转换为 map
我们可以通过以相反的顺序比较 id
,对 bookList
中的 Book
类对象的流进行排序。我们首先调用 comparingInt()
,我们传递 int
类型的 id
,然后反转调用 reverse()
方法的顺序。
我们可以在 Map
类对象上收集已排序的流。如果有一个重复的键,在我们的例子中是 2
,那么映射将采用解释 (oldValue, newValue) -> newValue
的相同 key
的新值。
import java.util.*;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
List<Book> bookList = new ArrayList<>();
bookList.add(new Book(1, "Barney's Version", "Mordecai Richler"));
bookList.add(new Book(2, "The Unsettlers", "Mark Sundeen"));
bookList.add(new Book(2, "The Debt to Pleasure", "John Lanchester"));
Map result1 = bookList.stream()
.sorted(Comparator.comparingInt(Book::getId).reversed())
.collect(Collectors.toMap(Book::getId, Book::toString,
(oldValue, newValue) -> newValue, LinkedHashMap::new));
System.out.println("Result 1 : " + result1);
}
}
输出:
Result 1 : {2=Book{ bookName='The Debt to Pleasure', author='John Lanchester'}, 1=Book{ bookName="Barney's Version", author='Mordecai Richler'}}
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn