代码之家  ›  专栏  ›  技术社区  ›  John Joe Mayank Nema

冗余“if”语句较少

  •  1
  • John Joe Mayank Nema  · 技术社区  · 6 年前

    我的代码如下

     private fun validateInput(): Boolean {
         if (etReportRow1.text.toString() == "" 
             || etReportRow2.text.toString() == "" 
             || etReportRow3.text.toString() == "")
             return false
         else
             return true
     }
    

    编译器告诉我

    冗余的“if”语句更少…(ctrl+f1)如果 可以简化为单个语句的语句。例如: if(foo())返回真否则返回假可以是 简化为返回foo()。

    建议的代码不会进入循环吗?

    5 回复  |  直到 6 年前
        1
  •  8
  •   Lino    6 年前

    形式上的所有语句:

    if(condition){
        return false
    } else {
        return true
    } 
    

    可以简化为:

    return !condition
    

    因此,在您的情况下,它将导致:

    return !(etReportRow1.text.toString() == "" || etReportRow2.text.toString() == "" || etReportRow3.text.toString() == "")
    

    或:

    return 
        etReportRow1.text.toString().isNotEmpty() && 
        etReportRow2.text.toString().isNotEmpty() && 
        etReportRow3.text.toString().isNotEmpty()
    

    注: isNotEmpty() 是扩展方法:

    public inline fun CharSequence.isNotEmpty(): Boolean = length > 0
    

    为了避免重复的代码,还可以使用 Sequence :

    public fun validateInput() = sequenceOf(etReportRow1, etReportRow2, etReportRow3)
        .map { it.text.toString() }
        .all { it.isNotEmpty() }
    
        2
  •  5
  •   Robby Cornelissen    6 年前

    因为布尔表达式的计算结果是布尔值,所以只需返回表达式本身的结果,而不必显式返回 true false .

    您可以使用以下单表达式函数进一步简化操作:

     private fun validateInput() = etReportRow1.text.toString() != "" && 
                                   etReportRow2.text.toString() != "" &&
                                   etReportRow3.text.toString() != ""
    
        3
  •  0
  •   Mayday    6 年前

    尝试

    return !(etReportRow1.text.toString() == "" || etReportRow2.text.toString() == "" || etReportRow3.text.toString() == "")
    
        4
  •  0
  •   Ctorres    6 年前

    我认为这应该有效:

    private fun validateInput() = !(etReportRow1.text.toString.isEmpty()  
                                    || etReportRow2.text.toString().isEmpty()
                                    || etReportRow3.text.toString().isEmpty() )
    
        5
  •  0
  •   Willi Mentzel user670265    6 年前

    更简洁:

    public fun validateInput() = setOf(
        etReportRow1, etReportRow2, etReportRow3
    ).none { 
        "${it.text}".isEmpty() 
    }