【问题标题】:Avoid nested if for null and parameter condition避免嵌套 if 用于 null 和参数条件
【发布时间】:2017-03-02 02:44:31
【问题描述】:

当我想检查变量/对象是否为null 以及变量/对象是否满足某些条件时,是否可以避免嵌套的if 语句。

var obj = "test";
if (obj != null) {
   if (obj.equals("test")) {
      //do something;
   }
}

是否可以在不定义自己的方法来处理此语句的情况下执行此语句?

【问题讨论】:

标签: java c#


【解决方案1】:

你也可以试试(用Java)

"test".equals(obj)

这样,您不必进行显式的空检查,

【讨论】:

    【解决方案2】:

    您可以使用空条件运算符? 和空合并运算符??

    if(obj?.Equals("test") ?? false)
    {
       // do something
    }
    

    如果objnull,则obj?.Equals("test") 返回null,如果?? 之前的值是null??false 分配给 if 语句。

    但遗憾的是,这仅适用于 C#,不适用于 Java。 Java 只知道条件运算符?,但不知道空合并运算符?? (is there a Java equivalent to null coalescing operator (??) in C#?)。

    【讨论】:

      【解决方案3】:

      建议大家熟悉一下conditional statements的短路

      如果您将使用&& 调用您的条件,如下所示:

      if (obj != null && obj.Equals("test"))
      {
          //do something;
      }
      

      您不会得到异常,因为如果obj == null 它将在第一个参数上返回false,并且不会检查&& 语句的第二个参数。

      || 中实现了相同的逻辑 - 如果第一个参数是 true,则不会检查另一个参数。

      java 中也实现了短路,因此您可以在c#java 中将嵌套的ifs 实现为&& 运算符的序列。

      【讨论】:

        【解决方案4】:

        是的,你可以。

        但是检查null应该是first,然后如果你的对象是null,它就会中断:

        var obj = "test";
        if(obj != null && obj.equals("test")){
            // do something;
        }
        

        【讨论】:

          【解决方案5】:

          operator && 可以允许你这样做。

          if(obj!=null && obj.equals("test")){
              //do something
          }
          

          【讨论】:

            【解决方案6】:

            使用逻辑&& 代替嵌套if&& 将仅在第一个条件为真时评估第二个条件(与嵌套如果做的事情相同)。所以obj.equals("test") 只会在第一个条件为真时被评估,即obj!=null

            if(obj!=null && obj.equals("test"))
            {
               // do something;
            }
            

            【讨论】:

            • 如果 obj ==null 会抛出空异常
            • 不,不会因为他用&&
            • @user2925656 : 操作 x && y 对应于操作 x & y,除了只有当 x 为真时才计算 y。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 2020-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多