首页 > 解决方案 > 按 id 访问和过滤 Java 类列表元素

问题描述

我有User如下类型的结果:

List<User> result  = (getting values from db)

我需要的 User 类的属性是:

private Integer id,
private String name, 
private List<Books> books = new ArrayList<>(); 

等等

并且 Class Books 有一个字段 Id。

鉴于我有用户 ID 和书籍 ID。我想访问数组书内的其他结果,以获取该书的 ID。

所以我需要 -> 给结果变量一个特定的用户 ID,并访问该用户的书籍属性,然后提供一个 bookId,并在该用户中访问该书籍 ID 的书籍属性。我尝试使用 java 流:

List<BooksDetails> userBook = result.stream()
  .filter(user -> user.getId() == 1)
  .collect(Collectors.toList())
  .get(0)
  .getBooks()
  .stream()
  .filter(book -> book.getId() == 2)
  .collect(Collectors.toList())
  .get(0)
  .getBooksDetails();

但有时我在访问 get(0) 元素时出现索引超出范围的错误。似乎有一个更清洁的解决方案。通过在列表中提供关联的 id,我可以使用哪些方法来访问嵌套属性?或者我是否必须将其转换为嵌套地图?

标签: java

解决方案


听起来您想要执行以下操作:

  • 过滤 userId == 1 的用户
  • 然后 flatMap 图书列表
  • 过滤这些书的 bookid == 2
  • 然后获取书籍详细信息并存储在列表中
record BooksDetails(){};
record Books(int getId, List<BooksDetails> getBooksDetails){}
record User(int getId, List<Books> getBooks){}
  
List<User> result = new ArrayList<>();
         
Optional<List<BooksDetails>> bd = result.stream()
     .filter(user -> user.getId() == 1)
     .flatMap(b->b.getBooks().stream())
     .filter(book -> book.getId() == 2)
     .findFirst()
     .map(Books::getBooksDetails);

更新

我已经更新了我的答案,包括records显示我对你的课程的理解。由于最终结果基于书籍 ID,因此我假设 1) 它是独一无二的。2)列表中没有重复的书籍。所以这将返回一个Optional<List<BooksDetails>>包含书籍详细信息列表bookIduserId. 如果没有找到书,它返回一个空的可选项。

另外,我用 Lambda 替换了 flatMap 并且它起作用了。


推荐阅读