在 Java 中將列表轉換為 map

Rupam Yadav 2023年10月12日
  1. 使用 ArrayList 和 HashMap 將 List 轉換為 Map
  2. 在 Java 中使用 StreamCollectors 將列表轉換為 map
  3. 在 Java 中使用排序和收集將列表轉換為 map
在 Java 中將列表轉換為 map

List 允許維護有序的物件集合。Map 物件將鍵對映到值。在 Java 中,有幾種方法可以將物件的 List 轉換為 Map。在本文中,我們將學習其中的一些。

使用 ArrayList 和 HashMap 將 List 轉換為 Map

Java 中的 List 介面允許物件的有序集合,並儲存重複值。它提供了基於索引的方法來更新、刪除、插入和搜尋元素。我們還可以在 List 中儲存空值。ArrayListLinkedList 是一些實現 List 介面的類。

Java 中的 Map 介面將唯一鍵對映到值,並且不能包含重複鍵。它具有基於該唯一鍵搜尋、更新和插入元素的有用方法。HashMap 類實現 Map 介面。

Book 類具有三個成員變數 bookNameauthorid 和這些屬性的 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 中使用 StreamCollectors 將列表轉換為 map

在 Java 8 中使用帶有 StreamCollectors 的 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 Yadav
Rupam Yadav avatar Rupam Yadav avatar

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

相關文章 - Java List

相關文章 - Java Map