拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在此Java8 应用程序中正确使用map运算子来检索、修改和更新数据库上的物件?

如何在此Java8 应用程序中正确使用map运算子来检索、修改和更新数据库上的物件?

白鹭 - 2022-02-11 1976 0 0

我正在开发一个基于 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()运算子)来实作以下行为:

  1. 检索User包含在Optional<User>使用存盘库检索的物件中的物件。

  2. 如果检索到的Optional<User>物件不为空 --> 在回传这个物件之前做一些操作。

  3. 如果检索到的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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *