gpt4 book ai didi

java - 使用 isPresent() 从 Optional 内部获取值

转载 作者:行者123 更新时间:2023-12-02 16:02:20 26 4
gpt4 key购买 nike

我有一个 User 和关联的有时间限制的 Role。我想知道 User 是否有特定的 UserRole 并且它未过期。我可以将用户的角色变成一个流,filter() 它和 findFirst(),给我一个 Optional

作用

public class Role {
private UserRole role;
private Date expiry;

public boolean isUnexpired () {
return (expiry == null) ? true : expiry.after(new Date());
}
}

用户

public class User {
//...
private Collection<Role> roles

public boolean hasRole (UserRole userRole) {
return roles.stream()
.filter(r -> r.getRole().equals(userRole))
.findFirst()
.ifPresent(ur -> { /* ... herein the problem ... */ ur.isUnexpired(); } );
}
}

最后一行的问题是 ifPresent() 的签名无效;因此,我无法从中返回 ur.isUnexpired()。那时我在 lambda 表达式或匿名内部类中放入的任何内容都无法对其找到的值做任何有意义的事情。

我尝试在过滤流并分配它之前声明一个 boolean 值,但得到(代码验证)错误:从 lambda 表达式引用的局部变量必须是最终的或有效的最终

(我知道,当它不存在时还有更多的事情要处理;如果我能解决这个问题,我可以切换到 ifPresentOrElse()。)

我可以做以下事情:

  public boolean hasRole (UserRole userRole) {
Optional<Role> o = roles.stream()
.filter(r -> r.getRole().equals(userRole))
.findFirst();
return o.isPresent() ? o.get().isUnexpired() : false;
}

但是,我宁愿使用更简洁的链式函数。

有什么方法可以提取和使用我的 isUn​​expired() boolean 值和链式函数吗?还是我必须分配 Optional 然后单独对其进行操作?

最佳答案

您应该使用 Optional::map 检索 isUn​​expired 的值,并使用 orElse 返回 false:

public boolean hasRole (UserRole userRole) {
return roles.stream()
.filter(r -> r.getRole().equals(userRole))
.findFirst()
.map(Role::isUnexpired)
.orElse(false);
}

关于java - 使用 isPresent() 从 Optional 内部获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70337324/

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