我想从if语句中删除多个条件.

我怎样才能做到这一点?

我认为switch不是我想要的.我正在考虑一些尊重开闭原则的东西,或者使用一个接口来调用不同的boolean方法.

现在我正在使用:

 if (utilisateur.isAdmin() || utilisateur.isWebMaster() || utilisateur.isAdministrateurLiferay() || utilisateur.estResponsableCommercial()) {

方法示例:

public boolean estResponsableCommercial() {
    return roles.stream().anyMatch(Role::isResponsableCommercial);
}

推荐答案

看起来你正在寻找一种方法来组合predicates,以便在像anyMatch这样的操作中使用它们.

如果是这样,您可以使用静态方法Predicate.or()实现这一点:

@SafeVarargs
public static <T> Predicate<T> combineWithOr(Predicate<T>... predicates) {
    
    return Arrays.stream(predicates).reduce(t -> true, Predicate::or); // if `predicates` is empty then method would return `true`, another way of expressing this: `reduce(Predicate::or).orElse(t -> true)`
}

以及如何应用它来获得复合谓词:

Predicate<UserRole> combinedPredicate = combineWithOr(
    UserRole::isAdmin,
    UserRole::isWebMaster,
    UserRole::isAdministrateurLiferay,
    UserRole::estResponsableCommercial
);
public static boolean hasMatchingRole(Collection<UserRole> roles,
                                      Predicate<UserRole> predicate){
    
    return roles.stream().anyMatch(predicate);
}

Java相关问答推荐

收听RDX中用户数据的变化

更新我们的一个文物后出现了严重的符号引用错误

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

如何确定springboot在将json字段转换为Dto时如何处理它?

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

如何在Application.yaml中连接字符串?

Java构造函数分支

如何将Pane的图像快照保存为BMP?

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

AbstractList保证溢出到其他方法

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

在应用程序运行时更改LookAndFeel

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

ControlsFX RangeSlider在方向垂直时滞后

简化每个元素本身都是 map 列表的列表

SonarQube在合并升级到java17后对旧代码提出错误

将Optionals/null安全添加到嵌套的flatMap/流