我也跳出了 Java 的世界,我认为可以拯救你的第一件事是 Scala 有很多编译器魔法,可以帮助你保持代码的简单和干净。
例如,以下是 Scala 的案例类将如何帮助您,我们可以使用它来定义一个类:
case class Student(name: String, height: Double, weight: Double)
而不是这个:
class Student {
public final String name;
public final String height;
public final String weight;
public Student(String name, double height, double weight) {
this.name = name;
this.height = height;
this.weight = weight;
}
}
是的,仅此而已,您不需要自己编写构造函数,并且您可以免费获得所有equals、hasCode、toString 方法。
在这个简单的例子中看起来没什么大不了的,但 Scala 确实让你在 OO 中建模变得更容易和更快,即使你没有使用函数式编程结构。
此外,高阶函数和其他函数式编程结构还将为您提供强大的工具来解决您在 Scala 中遇到的问题。
更新
好的,以下是函数式编程如何使您的代码更易于理解和清洁的示例。
函数式编程是一个很大的话题,但我发现即使我来自 Java 世界,也不了解什么是 monad 或 typeclass 什么的,Scala 的函数式编程结构仍然可以帮助我更轻松地解决问题,更有表现力。
很多时候我们需要遍历一个集合并对集合中的元素做一些事情,取决于一个条件来决定做什么。
举个简单的例子,如果我们想在java中遍历一个List,并删除所有大小为零的文件。我们将在 Java 中执行的操作可能如下所示:
List<File> files = getFiles()
for (File file: files) {
if (file.size() == 0) {
file.delete();
}
}
它非常简单明了,不是吗?但是使用 Scala 中的函数式编程结构,我们可以做到以下几点:
val files = getFiles()
val emptyFiles = files.filter(_.size == 0)
emptyFiles.foreach(_.delete())
如你所见,它的代码比 Java 的版本少,而且输出的意图也很明确——我们要过滤掉所有大小为 0 的文件,对于所有这些文件,请在其上调用 File.delete()。
一开始可能看起来很奇怪,但是一旦你习惯了它并以正确的方式使用它,它会让你的代码更容易阅读。
该技术在 Java (Function Java) 中是可行的,但最终它看起来像以下代码:
list.filter(new Predicate<File>() {
public boolean predicate(File f) {
return f.size() == 0;
}
})
我将坚持使用原始 for 循环版本,恕我直言。