我在这里和那里阅读有关 Scala 的信息,但我无法理解 Java 开发人员从使用 Scala 会获得什么。
我认为这与函数式编程有关。
有人可以给我一个具体的例子,说明我在 Java 中不能做的事情,而去 Scala 会救我吗?
这并不是要批评 Java 或类似的东西。我只需要了解 Scala 的用法
4 回答
我也从 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 循环版本,恕我直言。
具体来说你的问题:
- 在 scala 中,您可以进行模式匹配
- scala 具有高阶函数(与java8 lambdas 不同)
- 匿名函数字面量
- 强类型推断
- 懒惰的评价
- 方差注释
- 高等类型
- 具有特征的混合行为(可堆叠组合)
- 隐式定义和转换
- xml 文字
- REPL
我可以继续,但我敦促您至少阅读一些文档。
例如,您可以从这里开始
为了帮助您入门,Graham Lea 的这篇文章列出了 Scala 可以提高您的生产力的许多方法:
它开始于:
- 一个广泛而强大的集合框架
- 大大减少样板的收集方法
- 没有变异方法的不可变集合(与 java.util 类不同,如果列表是不可变的,则 List.add() 会抛出异常)
- 一个很棒的类似 switch 的函数,它不仅匹配数字、枚举、字符和字符串,而且可以简洁地匹配许多不同类中的各种模式,甚至在你自己的类中
- 为字段不变的类自动编写有意义的 equals、hashCode 和 toString 方法的注解(不使用反射)
- ...
而这样的例子不胜枚举。