java - 高效检查多个条件

标签 java performance conditional

<分区>

我遇到了一种情况,我需要检查多个条件,其中每个组合都有不同的结果。在我的特定情况下,我有 2 个变量,它们是枚举类型,每个变量可以是 2 个不同的值。

enum Enum1
{
    COND_1,
    COND_2
}
enum EnumA
{
    COND_A,
    COND_B
}
Enum1 var1;
EnumA varA;

这给了我 4 种可能的条件,这需要 4 种不同的结果。我想出了几种不同的方法来执行此操作,使用 if 语句或 switch 语句:

if(var1 == Enum1.COND_1 && varA == EnumA.COND_A)
{
    // Code
}
else if(var1 == Enum1.COND_1 && varA == EnumA.COND_B)
{
    // Code
}
else if(var1 == Enum1.COND_2 && varA == EnumA.COND_A)
{
    // Code
}
else if(var1 == Enum1.COND_2 && varA == EnumA.COND_B)
{
    // Code
}

或者:

switch(var1)
{
    case COND_1:
        switch(varA)
        {
            case COND_A:
                // Code
                break;
            case COND_B:
                // Code
                break;
        }
        break;
    case COND_2:
        switch(varA)
        {
            case COND_A:
                // Code
                break;
            case COND_B:
                // Code
                break;
        }
        break;
}

我已经想到了其他人,但不想用代码来填充:P 我想知道最好的方法是什么。我认为 switch 更容易阅读,但 ifs 更短。我认为如果 switch 可以有多个条件会很酷,但我还没有听说过。这也引出了一个问题:使用任意数量的变量和可能的值,最好的方法是什么?

最佳答案

对于您的小用例,我可能会选择嵌套的 if 语句。但是,如果您有大量的 enum 常量,也许使用流的模式可以使您的代码更易于阅读和维护(性能损失很小)。您可以使用这样的流来解决它:

Stream.of(new Conditional(COND_1, COND_A, () -> {/* do something */}),
          new Conditional(COND_1, COND_B, () -> {/* do something */}),
          new Conditional(COND_2, COND_A, () -> {/* do something */}),
          new Conditional(COND_2, COND_B, () -> {/* do something */}))
      .filter(x -> x.test(var1, varA))
      .findAny()
      .ifPresent(Conditional::run);

这需要一个支持类:

class Conditional implements BiPredicate<Enum1, EnumA>, Runnable
{
    private final Enum1 var1;
    private final EnumA varA;
    private final Runnable runnable;

    public Conditional(Enum1 var1, EnumA varA, Runnable runnable) {
        this.var1 = var1;
        this.varA = varA;
        this.runnable = runnable;
    }

    @Override
    public boolean test(Enum1 enum1, EnumA enumA) {
        return var1 == enum1 && varA == enumA;
    }

    @Override
    public void run() {
        runnable.run();
    }
}

关于java - 高效检查多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40860009/

相关文章:

php - 基于服务器 url 路径的条件 header 源

c - C 条件语句总是返回 1 或 0 吗?

java - DisplayTag:即使没有要显示的数据也显示标题

java - 多级同步语句的目的是什么?

xml - Delphi XML (MSXML) 例程的二次运行时

java - 在生产环境中运行 Tomcat

基于目标值的 C# AutoMapper 条件映射

java - 将服务器响应写入浏览器 : Java

java - 从解析的 XML 文件创建表时发生 Android 错误

c++ - C++11 move 语义是在做一些新的事情,还是只是让语义更清晰?