我在Scala中可以做些什么,我不能用Java做什么?

时间:2013-03-06 07:59:50

标签: java scala

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

4 个答案:

答案 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;
  }
}

是的,就是这样,您自己不需要编写构造函数,并且您可以免费获得所有equalshasCodetoString方法。

在这个简单的情况下,它可能看起来不是什么大问题,但是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

首先是:

  • 广泛而强大的馆藏框架
  • 大大减少样板的收集方法
  • 不具有变异方法的不可变集合(与java.util类不同,例如List.add()如果列表是不可变的则抛出异常)
  • 一个很棒的类似开关的函数,它不仅匹配数字,枚举,字符和字符串,而且可以简洁地匹配许多不同类中的各种模式,即使在你自己的类中也是如此
  • 一个注释,自动为字段不变的类(不使用反射)写入有意义的equals,hashCode和toString方法
  • ...

然后列表继续。

答案 2 :(得分:2)

具体问题:

  • 在scala中你可以模式匹配
  • scala具有更高阶函数(与java8 lambdas不同
  • 匿名函数文字
  • 强类型推断
  • 懒惰的评价
  • 方差注释
  • 更高级的种类
  • 混合行为与特征(可堆叠的构图)
  • 隐式定义和转换
  • xml literals
  • REPL

我可以继续,但我恳请你至少阅读一些文件 例如,您可以启动here

答案 3 :(得分:0)

功能编程是最简洁和准确的陈述。这和scala促进的更短,更具表现力的代码转化为更高的生产力。

Scala也更Conscisce

还有其他几个examples