gpt4 book ai didi

java - Java 流是否仅用于数组?单元素呢?

转载 作者:行者123 更新时间:2023-11-29 08:20:26 25 4
gpt4 key购买 nike

我一直在研究 Java 流和函数式编程。
想出了一种方法来重写一个小的“用户登录”代码。

这是我的登录方法;
如果查询的用户为空,则在过滤器上处理空指针异常。

    public ResponseEntity login(User request) {
User dbUser = userRepo.findByEmail(request.getEmail());
if (!aes.matches(request.getPassword(), dbUser.getPassword()))
return ResponseEntity.status(403).build();

return logUserIn(dbUser);
}

private ResponseEntity logUserIn(User dbUser) {
dbUser.setPassword(null);
jwtHandler.setJwtCookie(dbUser);
return ResponseEntity.ok(dbUser);
}

并通过使用流;

    public ResponseEntity login(User request) {
return Stream.of(userRepo.findByEmail(request.getEmail()))
.filter(dbUser -> aes.matches(request.getPassword(), dbUser.getPassword()))
.map(this::logUserIn)
.findFirst()
.orElse(ResponseEntity.status(403).build());
}

private ResponseEntity logUserIn(User dbUser) {
dbUser.setPassword(null);
jwtHandler.setJwtCookie(dbUser);
return ResponseEntity.ok(dbUser);
}

我不知道流是否应该以这种方式使用。是吗?
如果我在项目的更重要部分使用类似的逻辑,我以后会遇到麻烦吗?

最佳答案

您可能会对 if-else 感觉更好如果您以更实用的方式使用它而不是短路:

if (!aes.matches(request.getPassword(), dbUser.getPassword())) {
return ResponseEntity.status(403).build();
}
else {
return logUserIn(dbUser);
}

在一个语句中使用 Stream/Optional 进行等价操作更难阅读且性能更差。

您可能会考虑制作 findByEmail 的可能性返回 Optional<User> ,这对于任何“查找”方法来说都更为惯用。然后你可以结合这两种方法,比如

return userRepo.findByEmail(request.getEmail()).map(dbUser -> {
if (!aes.matches(request.getPassword(), dbUser.getPassword())) {
return ResponseEntity.status(403).build();
}
else {
return logUserIn(dbUser);
}
})... // .orElse(null) / .orElseThrow(...)

关于java - Java 流是否仅用于数组?单元素呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59400082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com