【问题标题】:how to convert java method return to scala? [duplicate]如何将java方法返回到scala? [复制]
【发布时间】:2017-07-31 23:09:08
【问题描述】:

如何将此 java 代码转换为 scala ? Scala 不喜欢“返回”,那么 Scala 有更好的版本吗?

public void myMethod(String name){
  if(s==null) return;
  //other logic and many lines ....
}

【问题讨论】:

  • 这没有错。 return 对于提早退出警戒条件很有用。如果您想避免它,只需将其余方法放入 if 的 else 部分。但是,如果您想编写“惯用的” scala.返回一个值,不要编写 void 方法(Scala 中的Unit)。保持你的方法和函数简短,这样做可以使它们更易于重用,并减少提前返回的需要。
  • 我同意你的看法。这么多行放在 else 中,很难阅读。
  • 不应该比你已经拥有的更难阅读。从可读性的角度来看,if (condition) return; //lots of codeif (condition) else{ //lots of code} 之间没有太大区别

标签: scala


【解决方案1】:

让我们分两步完成:

def myMethod(name: String): Unit =
  if(name == null) () else{
    //rest of code that works via side-effect
  }

() 表示Unit 的一个实例。

没关系,但还有更好的东西!这利用了 Option 构造函数具有特殊的 null 处理,例如Option(null) == None.

def myMethod(name: Option[String]): Unit = name.foreach{
  //rest of code that works via side-effect
}

如果您有可能是 null 的东西,您将确保类型系统指定变量可能包含也可能不包含值(是的,Java 现在也有 Optional 并且出于类似的原因!)

【讨论】:

    【解决方案2】:

    或者这样重构代码:

    def myMethod(name: String) = {
      if (name != null) {
      //other logic and many lines ....
      }
    }
    

    【讨论】:

      【解决方案3】:

      简短的回答是您不需要使用 return 关键字。回报是 Scala 几乎解释了here,但我想指出一些事情。

      表达式与语句

      Java 中的大多数构造都是语句,这意味着它们只执行,评估。这一点非常重要,因为在 Scala 中,大多数这些结构都是表达式。让我们看看这在 if 结构上是如何工作的。

      // Initialize i to 1 if some condition is true otherwise to 0
      int i;
      if (someCondition) i = 1;
      else i = 0;
      

      假设我们想一步初始化 i(也许我们想将其设为最终),我们需要使用三元运算符:

      final int i = someCondition ? 1 : 0;
      

      这是可行的,因为右侧实际上是一个表达式。现在让我们用 Scala 来写:

      val i = if (someCondition) 1 else 0
      

      这是一个条件表达式。

      功能

      关于函数要记住的一点是,函数的返回值等于其最后一个表达式的结果。这就是您可以将 if 表达式定义为函数中的最新表达式,因此将返回其结果。将其应用于您的代码会给我们留下:

      def myMethod(name: String): Int = {
        if (s == null) -1
        else { ... }
      }
      

      我已更新您的方法以在这种情况下返回Int,以供争论。您可能需要用更有意义的东西替换它。在 else 分支上,在这种情况下,您还需要返回 Int。无论如何,我希望这能清除您的请求。

      作为结束语,this 是一个很好的指南,解释了为什么应该避免使用 return。就个人而言,我根本没有使用过它,尽管那里有一些例子。

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        相关资源
        最近更新 更多