java - 我在 Scala 中可以做什么在 Java 中不能做的事情?

标签 java scala

<分区>

我到处阅读有关 Scala 的资料,但我无法理解 Java 开发人员从跳转到 Scala 中会得到什么。
我认为这与函数式编程有关。
有人可以给我一个具体的例子,说明我不能用 Java 做的事情,而去 Scala 会救我吗?
这并不是要批评Java或类似的东西,我只需要了解Scala的用法

最佳答案

我也是从 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;
  }
}

是的,就是这样,你不需要自己写构造函数,你有所有那些equalshasCodetoString方法免费。

在这个简单的案例中,这看起来似乎没什么大不了的,但 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 循环版本。

关于java - 我在 Scala 中可以做什么在 Java 中不能做的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15241903/

相关文章:

java - 静态成员需要特殊的同步块(synchronized block)吗?

java - 如何使用Android中的评分栏(最好使用Kotlin)从API(Google api)显示评分值(整数)?

scala - scala中下划线(_)和三重问号(???)的区别

java - Clojure 中的编译问题

java - 如何在 Java 中向 hibernate 线程发出信号?

java - 将项目动态添加到 Windows 资源管理器的上下文菜单

scala - 如何在 Eclipse 中将 Swing 与 Scala 2.11 一起使用?

scala - scala 代码的人类可读大小单位(文件大小)(例如持续时间)

scala - 如何在 Scala 中使用 Stream.cons 编写非泄漏尾递归函数?

algorithm - 获取 Scala Iterable 的前 n 个元素的最简单方法