gpt4 book ai didi

Java 8 : Iterate and group objects from list based on object attributes

转载 作者:行者123 更新时间:2023-12-04 21:28:49 25 4
gpt4 key购买 nike

我有一个类似于下面的列表(GlobalBooks)

import java.util.ArrayList;
import java.util.List;

public class Main {

public static void main(String[] args) {

GlobalBooks globalBooks = new GlobalBooks();

List<Book> bookList = new ArrayList<Book>();


Book book = new Book();
List<BookContent> bookContents = new ArrayList<BookContent>();

book.setBookName("A");
BookContent content = new BookContent();
content.setDescription("December 2016");
content.setComponentID(20l);
bookContents.add(content);

content = new BookContent();
content.setDescription("January 2016");
content.setComponentID(30l);
bookContents.add(content);

content = new BookContent();
content.setDescription("Febuary 2016");
content.setComponentID(40l);
bookContents.add(content);
book.setContents(bookContents);

bookList.add(book);


book = new Book();
bookContents = new ArrayList<BookContent>();

book.setBookName("B");
content = new BookContent();
content.setDescription("December 2016");
content.setComponentID(20l);
bookContents.add(content);

content = new BookContent();
content.setDescription("January 2016");
content.setComponentID(30l);
bookContents.add(content);

content = new BookContent();
content.setDescription("Febuary 2016");
content.setComponentID(40l);
bookContents.add(content);
book.setContents(bookContents);

bookList.add(book);

globalBooks.setBooks(bookList);


System.out.println(globalBooks);


}

}

我正在寻找可以流式传输 globalBooks 响应并根据 BooksContent 中的描述字段收集图书列表映射的 Java 8 函数。

Map<String,List<Books>>即所有具有相同描述的书籍都应该按描述分组在一起吗?

我可以通过常规 java 执行此操作,但代码变得太困惑和不整洁。

最佳答案

由于每本书都有不同描述的多个内容,因此您需要每本书出现在多个 map 条目中。所以我会使用 flatMap 为每个 BookContent 创建一个流元素,特别是 Description+Book 对。然后像往常一样使用 Collectors.groupingBy 收集到 map 中:

    Map<String,List<Book>> result = globalBooks.getBooks().stream().flatMap(
(Book b) -> b.getContents().stream().map(
(BookContent bc) -> new Pair<>(bc.getDescription(), b)
)
).collect(Collectors.groupingBy(
Pair::getKey,
Collectors.mapping(Pair::getValue, Collectors.toList())
));

注意:

我上面使用的 Pair 类来自 javafx.util.Pair。但是,您可以轻松地使用 AbstractMap.SimpleEntry、您自己的 Pair 类或任何能够容纳两个对象的集合数据类型。

关于Java 8 : Iterate and group objects from list based on object attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com