我正在阅读有关Scala的信息,但我无法理解Java开发人员在跳转Scala时会获得什么。
我认为这与函数式编程有关
有人可以给我一个具体的例子,说明我不能用Java做什么,去Scala会救我吗?
这并不是对Java或类似东西的批评。我只需要了解Scala的用法
答案 0 :(得分:3)
我也是从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或类型类或者其他什么,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-loop版本,恕我直言。
答案 1 :(得分:2)
为了帮助您入门,Graham Lea撰写的这篇文章列出了Scala可以提高您的工作效率的许多方法:
A New Java Library for Amazing Productivity
首先是:
然后列表继续。
答案 2 :(得分:2)
具体问题:
我可以继续,但我恳请你至少阅读一些文件 例如,您可以启动here
答案 3 :(得分:0)