在迁移到Scala时,反对Java形成的习惯

Nut*_*tel 13 java migration scala

Java开发人员迁移到Scala时最常犯的错误是什么?

错误我的意思是编写一个不符合Scala精神的代码,例如在类似地图的函数更合适时使用循环,过度使用异常等.

编辑:还有一个是使用自己的getter/setter而不是Scala生成的方法

Von*_*onC 9

这很简单:Java程序员倾向于编写命令式样式代码,而类似Scala的方法则涉及功能样式.


oxb*_*kes 8

一个显而易见的方法是不利用scala允许的嵌套作用域,加上延迟副作用(或者意识到scala中的所有内容都是表达式):

public InputStream foo(int i) {
   final String s = String.valueOf(i);
   boolean b = s.length() > 3;
   File dir;
   if (b) {
       dir = new File("C:/tmp");
   } else {
       dir = new File("/tmp");
   }
   if (!dir.exists()) dir.mkdirs();
   return new FileInputStream(new File(dir, "hello.txt"));
}
Run Code Online (Sandbox Code Playgroud)

可以转换为:

def foo(i : Int) : InputStream = {
   val s = i.toString
   val b = s.length > 3
   val dir = 
     if (b) {
       new File("C:/tmp")
     } else {
       new File("/tmp")
     }
   if (!dir.exists) dir.mkdirs()
   new FileInputStream(new File(dir, "hello.txt"))
}
Run Code Online (Sandbox Code Playgroud)

但是这可以在很多方面得到改善.它可能是:

def foo(i : Int) = {
   def dir = {
     def ensuring(d : File) = { if (!d.exists) require(d.mkdirs); d }
     def b = { 
       def s = i.toString
       s.length > 3
     }
     ensuring(new File(if (b) "C:/tmp" else "/tmp"));
   }
   new FileInputStream(dir, "hello.txt")
}
Run Code Online (Sandbox Code Playgroud)

后一个例子不会"导出"任何超出所需范围的变量.事实上,它不声明任何变量在所有.这意味着以后更容易重构.当然,这种方法确实导致了巨大的类文件!

  • 您只保存了一行代码并失去了大量的可读性. (6认同)

Sam*_*sby 7

我最喜欢的几个:

  1. 我花了一段时间才意识到Option是多么有用.Java带来的一个常见错误是使用null来表示有时没有值的字段/变量.认识到你可以在Option上使用'map'和'foreach'来编写更安全的代码.

  2. 学习如何在Scala集合中使用'map','foreach','dropWhile','foldLeft',...以及其他方便的方法来保存编写你在Java中随处可见的循环结构,我现在认为它是冗长的,笨拙,更难阅读.