我正在开发一个基于 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))));
0 评论