【问题标题】:Redundant 'if' statement less减少多余的“if”语句
【发布时间】:2019-06-06 05:12:51
【问题描述】:

我的代码如下

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

编译器告诉我

冗余 'if' 语句 less... (Ctrl+F1) 此检查报告 if 可以简化为单个语句的语句。例如: if (foo()) { return true } else { return false } 可以 简化为返回 foo()。

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

【问题讨论】:

  • 你可以直接返回!(etReportRow1.text.toString() == "" || etReportRow2.text.toString() == "" || etReportRow3.text.toString() == " ")
  • 顺便说一句,避免使用== 进行对象(字符串)比较
  • @MauricePerry 这是一个 kotlin 问题,它用== 覆盖了equals(),所以这可以正常工作
  • @MauricePerry 如果我们不犯错误,我们将无法改进 ;)
  • @Lino ... 而且我们不需要像 stackoverflow 这样的网站

标签: if-statement kotlin


【解决方案1】:

表格中的所有语句:

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】:

    由于布尔表达式的计算结果为布尔值,因此您可以简单地返回表达式本身的结果,而无需显式返回 truefalse

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

     private fun validateInput() = etReportRow1.text.toString() != "" && 
                                   etReportRow2.text.toString() != "" &&
                                   etReportRow3.text.toString() != ""
    

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

        【解决方案4】:

        我认为这应该可行:

        private fun validateInput() = !(etReportRow1.text.toString.isEmpty()  
                                        || etReportRow2.text.toString().isEmpty()
                                        || etReportRow3.text.toString().isEmpty() )
        

        【讨论】:

          【解决方案5】:

          更简洁:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-28
            • 2021-02-21
            • 1970-01-01
            • 2018-02-11
            • 2012-05-11
            相关资源
            最近更新 更多