我有一個User型別的結果,如下所示:
List<User> result = (geting values from db)
List<User> result = (getting values from db)
我需要的class User的屬性是。
private Integer id,
private String name,
private List<Books> books = new ArrayList<>()。
等。
而Class Books有一個欄位Id to。
鑒于我有用戶的Id,和書籍的Id。我想訪問陣列book中的其他結果,對于那個book 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來訪問嵌套屬性? 或者我必須將其轉換為一個嵌套的地圖?
uj5u.com熱心網友回復:
List result = (getting values from db)
可能不是你期望的答案,但是這個預測過濾器(對于user.id == 1和book.id == 2)& find-first可能可以在result之前的一層實作,作為(資料庫/SQL)查詢。
例如:
SELECT u.*
FROM users u
JOIN books b ON b.user_id = u.id
WHERE u.id = 1 AND b.id = 2.
uj5u.com熱心網友回復:
聽起來你想做的是:
- 過濾用戶為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<>()。
可選<List<BooksDetails>> bd = result.stream()
.filter(user -> user.getId() == 1)
.flatMap(b->b.getBooks().stream())
.filter(book -> book.getId() == 2)
.findFirst()
.map(Books::getBooksDetails)。
Update
我已經更新了我的答案,包括records,這表明我對你的類的理解。 由于最終的結果是基于一個書的ID,我假定1)它是唯一的。2)串列中沒有重復的書。 所以這將回傳一個Optional<List<BooksDetails>>,其中包含該bookId的userId的書籍細節串列。 如果沒有找到書,它將回傳一個空的選項。
另外,我用Lambda替換了flatMap,它也成功了。
uj5u.com熱心網友回復:
你可以使用stream來過濾list,基于user id。然后檢查filteredList是否為空,以獲得資料。
import java.util.*;
import java.util.stream.*;
public class MyClass {
public static void main(String args[]){
final List<User> users = Arrays. asList(new User(1, "name1") 。new User(2, "name2") )。
final User filteredUser = users.stream().filter(u -> u.id ==2)
.findFirst().orElse(null)。
System.out.println(filteredUser)。
if (null != filteredUser) {
//把你的邏輯放在這里。
} else {
//把你的邏輯放在這里。
}
}
}
class User {
public final int id;
public final String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return " [id: " id ", name: " name "】"。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321081.html
標籤:
上一篇:ImageView回傳到Android中Drawable檔案設定的Null
下一篇:如何根據出現的次數來添加額外的列
