Java steam流中toMap、groupingBy的簡單用法
阿新 • • 發佈:2021-02-02
@Data
@ToString
public class Book {
private String category;
private String name;
private int stock;
public Book(String category, String name, int stock) {
this.category = category;
this.name = name;
this.stock = stock;
}
}
public static void main(String[] args) {
List<Book> bookList = new ArrayList<>();
bookList.add(new Book("小說", "《西遊記》", 1));
bookList.add(new Book("小說", "《鹿鼎記》", 2));
bookList.add(new Book("歷史", "《史記》", 3));
bookList. add(new Book("歷史", "《四書五經》", 4));
// 根據型別進行彙總,同一個型別的書籍物件放到一個List中
Map<String, List<Book>> bookMap1 = bookList.stream()
.collect(Collectors.groupingBy(Book::getCategory));
System.out.println(bookMap1);
// 輸出: {"歷史":[{"category":"歷史","name":"《史記》","stock":3},{"category":"歷史","name":"《四書五經》","stock":4}],"小說":[{"category":"小說","name":"《西遊記》","stock":1},{"category":"小說","name":"《鹿鼎記》","stock":2}]}
// 根據型別進行彙總,同一個型別的書籍名稱放到一個List中
Map<String, List<String>> bookMap2 = bookList.stream()
.collect(Collectors.groupingBy(Book::getCategory, Collectors.mapping(Book::getName, Collectors.toList())));
System.out.println(bookMap2);
// 輸出: {"歷史":["《史記》","《四書五經》"],"小說":["《西遊記》","《鹿鼎記》"]}
// 轉化為名稱,庫存Map
Map<String, Integer> bookMap3 = bookList.stream()
.collect(Collectors.toMap(Book::getName, Book::getStock, (oldVal, newVal) -> newVal));
System.out.println(bookMap3);
// 輸出: {"《四書五經》":4,"《史記》":3,"《鹿鼎記》":2,"《西遊記》":1}
// 根據名稱進行庫存量的彙總
Map<String, Integer> bookMap4 = bookList.stream()
.collect(Collectors.toMap(Book::getCategory, Book::getStock, Integer::sum));
System.out.println(bookMap4);
// 輸出: {"歷史":7,"小說":3}
}