【问题标题】:How can I optimize the following if else?如果不是,我该如何优化以下内容?
【发布时间】:2019-09-23 03:34:50
【问题描述】:

我有以下 if else 阻塞。

if (result.first && result.last) {
    output= "both present"
} else if (!result.first && result.last) {
    output= "last present"
} else if (result.first && !result.last) {
    output= "first present"
} else {
    output = "none present"
}

代码看起来很笨拙。有什么办法可以优化一下。

【问题讨论】:

  • 这可能很有趣:stackoverflow.com/questions/42437655/…。 ENums 是使您的代码非常易于阅读和理解的好方法。
  • 如果你先编译你的代码就好了。
  • 一种可能性是将导致 true 的最可能的条件移到顶部。短路 & 是另一种选择。
  • 你仍然必须有 4 个字符串(“both”、“last”、“first”、“none”),所以我猜这个 if 是最短的。
  • 它有什么问题(除了它不会编译)。它有效且快速。如果您不喜欢它的外观,请将其隐藏在某个方法中:String output = whatIsResult(result.first, result.last);

标签: java if-statement


【解决方案1】:

一种奇特的方法是使用三元运算符。这与使用 if-cascade 没有什么不同,但它是一个单一的分配(如果outputfinal 很方便,尽管即使在这种情况下也不是绝对必要的)。

output = 
  result.first 
    ? (result.last ? "both present" : "first present")
    : (result.last ? "last present" : "none present");

由于有 4 种可能的结果,因此不可能将其减少到 log_2(4) == 2 嵌套条件以下。

您还可以使用预定义的查找图。

【讨论】:

    【解决方案2】:
    if (result.first && result.last){
       output= "both present"
    } else if (result.last) {
       output= "last present"
    } else if (result.first) {
       output= "first present"
    } else {
       output = "none present"
    }
    

    另外,如果可以的话,你可以把逻辑放到“结果”中,那么你就不必“得到”属于结果的东西了。如果您将逻辑推得足够高,您甚至可以用多态性替换 if/else。

    【讨论】:

      【解决方案3】:

      使用嵌套的if 语句,而不是同时检查单个条件:

      if (result.first) {
          if (result.last) {
              output = "both present";
          } else {
              output = "first present";
          }
      } else {
          if (result.last) {
              output = "last present";
          } else {
              output = "none present";
          }
      }
      

      这很容易导致使用三元条件运算符:

      if (result.first) {
          output = (result.last ? "both present" : "first present");
      } else {
          output = (result.last ? "last present" : "none present");
      }
      

      也可以嵌套:

      output = (result.first ? (result.last ? "both present" : "first present")
                             : (result.last ? "last present" : "none present"));
      

      如果要检查的布尔值很多,深度嵌套会变得很麻烦,因此您可以选择使用位掩码:

      private static final String[] OUTPUTS = { "none present", "first present",
                                                "last present", "both present" };
      
      output = OUTPUTS[(result.first ? 1 : 0) + (result.last ? 2 : 0)];
      

      【讨论】:

        【解决方案4】:
        output = "none present"
        if (result.first){
           output= "first present"
           if(result.last){
              output= "both present"
            }
        } else if (result.last) {
        output= "last present"
        }
        

        【讨论】:

        • 我的错。我错过了。
        • 但是你可以用这个解决方案给output赋值3次,这是一个缺点
        • 确实如此,但我相信比较会在系统上产生更多(尽管不明显)成本。
        【解决方案5】:

        这是我处理此类语句的方法,假设 result 是一个对象并且有两个原始布尔成员(请记住,在“大”布尔值中可能为空)first 和 @ 987654323@(使用 getter 方法

        public class Result {
        
          private boolean first;
          private boolean last;
        
        //getters, constructor etc
        
        }
        

        让我们将条件包装在Predicate 中并将其放入map 中,其中key 是谓词,value 是预期值:

        private final static Predicate<Result> = RESULT_1-> result.getFirst() && result.getLast();
        private final static Predicate<Result> = RESULT_2 -> !result.getFirst() && result.getLast();
        private final static Predicate<Result> = RESULT_3 -> result.getFirst() && !result.getLast();
        
        private final static DEFAULT_VALUE = "none present";
        
        private final static Map<Predicate<Result>, String> RESULT_MAP = Map.of(
        RESULT_1, "both present",
        RESULT_2, "last present",
        RESULT_3, "first presnt");
        

        那么就可以这样使用了:

        String output = map.entrySet().stream().filter(predicate -> predicate.getKey().test(resultToTest))
                .findFirst()
                .map(Entry::getValue).orElse(DEFAULT_VALUE);
        

        当然,给这些变量起一个有意义的名字,做一些提取等等。在这种方法中,当你必须向代码添加新条件时,你只需向映射添加新谓词,仅此而已。如果你的情况小,你不必像我展示的那样编写灵活的代码,但在更复杂的问题中,这种方法是合适的。

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 1970-01-01
          • 2020-10-11
          • 1970-01-01
          • 1970-01-01
          • 2021-06-05
          • 2019-11-06
          • 2011-12-26
          • 2022-11-15
          相关资源
          最近更新 更多