java - 按 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,我可以使用哪些方法来访问嵌套属性?或者我是否必须将其转换为嵌套地图?
解决方案
听起来您想要执行以下操作:
- 过滤 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>>
包含书籍详细信息列表bookId
的userId
. 如果没有找到书,它返回一个空的可选项。
另外,我用 Lambda 替换了 flatMap 并且它起作用了。
推荐阅读
- python - 有没有更自动化的方法来发现子字符串?
- v8 - SetAccessor 和 SetAccessorProperty,有什么区别?
- python - 在这种情况下如何打印 valueError
- rust - 调用借用不可变的闭包时,不能在循环中借用可变的?
- ios - 应用程序在 CLClientStopVehicleHeadingUpdates 上崩溃
- python - 使用 url 标签时的问题
- javascript - summernote 添加额外内容
- python - Pandas - 根据 A 列中的值访问 B 列中的值
- html - 3个具有相同css的div,但它们的高度不同
- sqlite - 显示按一列排序的前 n 行,但它们应该在另一列中是唯一的(SQLite,Android Room)