我正在開發一個基于 Spring Boot 的 Java 8 專案,并且在嘗試對我的代碼使用“功能”方法時發現了一些困難。我承認我仍然使用 Java 7 方法,并且正在嘗試使用現代構造改進我的代碼。
我有這個服務類方法:
/`
* Deactivate an user retrieved by its user ID
* @throws NotFoundException
*/
@Override
public Optional<User> deactivateUser(int userId) throws NotFoundException {
Optional<User> retrievedUser = this.userRepository.findById(userId);
return Optional.ofNullable(retrievedUser)
.map((user) -> retrievedUser.get())
.orElseThrow(() -> new NotFoundException(String.format("The user having ID %s was not found", userId))));
}
如您所見,它首先Optional<User>使用 Spring Data JPA 存盤庫檢索物件。
然后我嘗試使用功能方法(使用map()運算子)來實作以下行為:
檢索
User包含在Optional<User>使用存盤庫檢索的物件中的物件。如果檢索到的
Optional<User>物件不為空 --> 在回傳這個物件之前做一些操作。如果檢索到的
Optional<User>物件為空 --> 拋出NotFoundException()例外。
我認為第 1 點和第 3 點沒問題。問題是我不明白如何正確地將一些邏輯放入map()函式中,目前我有這樣的事情:
.map((user) -> retrievedUser.get())
究竟是什么意思?我認為它將User由 檢索retrievedUser.get()到的物件放入user回傳的變數中。我的推理正確嗎?(我絕對不確定)。
我的問題是在回傳這個User物件之前我需要執行一些操作(基本上更新一個名為isActive設定它的欄位false,然后使用 Spring Data JPAsave()方法更新它)。我該怎么做?你能給我舉個例子嗎?我認為這對我來說可能是一個足夠的例子,我在map()運算子中有一個多行函式(也是一個首先執行retrievedUser.get()操作并將其列印到另一行的函式,然后我應該能夠自己執行所需的邏輯) .
uj5u.com熱心網友回復:
該地圖的方法需要一個功能物件作為引數。Function 是一個泛型介面,只有一個方法,其作用類似于回呼,因此為了達到您想要的結果,您必須實作此介面并將其傳遞給該方法。為此,您可以使用lambda 運算式來實作它(這是您嘗試做的方式)。在這種情況下,將呼叫該函式并傳遞您的存盤庫找到的物件。
你可能想要這樣的東西:
return Optional.ofNullable(retrievedUser)
.map((user) -> {
// do your operation with the object
return user;
})
.map(updatedUser -> userRepository.save(updatedUser))
.orElseThrow(() -> new NotFoundException(String.format("The user having ID %s was not found", userId))));
請注意,在 lambda 運算式中,您處理的是User而不是Optional<User>,因此不需要在.get()那里使用。您還應該注意orElse/orElseThrow型別的函式回傳物件的實體而不是 Optional,因此您必須更改方法的回傳型別。
如果想了解每個操作的作用以及如何使用它們,這篇文章非常適合閱讀。
uj5u.com熱心網友回復:
您可以撰寫一個接受用戶并回傳用戶的函式來執行 (2) 的邏輯。例如 :
public User processUser(User user) {
user.setActive(false);
return user;
}
然后在地圖運算子中參考此函式:
return Optional.ofNullable(retrievedUser
.map((user) -> processUser(user))
.orElseThrow(() -> new NotFoundException(String.format("The user having ID %s was not found", userId))));
您可以進一步使用方法參考將其簡化為:
return Optional.ofNullable(retrievedUser
.map(this::processUser)
.orElseThrow(() -> new NotFoundException(String.format("The user having ID %s was not found", userId))));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407760.html
標籤:
上一篇:如何為樹創建遞回添加方法
