【问题标题】:What can I do in Scala that I could not do in Java? [duplicate]我可以在 Scala 中做什么而在 Java 中无法做到? [复制]
【发布时间】:2013-02-20 22:08:33
【问题描述】:

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

【问题讨论】:

  • 如果您对 Scala 感兴趣,为什么不按照教程了解一下该语言的外观和功能,并看看您是否喜欢它?从www.scala-lang.org开始
  • 我会听从 cmets 的建议,开始对 大量 个处理您的问题的博客进行一些研究。然后,您可以在需要澄清时参考 stackoverflow 以了解更具体的问题。
  • 也看看this
  • 还有this

标签: java scala


【解决方案1】:

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

Scala 也比较多Conscisce

还有其他几个examples

【讨论】:

  • 但是我没有得到我用 Java 没有的函数式编程所获得的东西
  • @Jim 强调不变性,大大减少了 bug 并降低了并发的复杂性。我发现在 Java 中应用函数式编程的原则使我的代码更容易理解的情况。
【解决方案2】:

为了帮助您入门,Graham Lea 的这篇文章列出了 Scala 可以提高您的工作效率的多种方式:

A New Java Library for Amazing Productivity.

开头是:

  • 广泛而强大的集合框架
  • 大大减少样板的收集方法
  • 不具有突变方法的不可变集合(与 java.util 类不同,如果列表不可变,则 List.add() 会引发异常)
  • 一个很棒的类似 switch 的函数,它不仅可以匹配数字、枚举、字符和字符串,还可以简洁地匹配许多不同类中的各种模式,甚至在您自己的类中
  • 一个注解,自动为字段不变的类编写有意义的 equals、hashCode 和 toString 方法(不使用反射)
  • ...

名单还在继续。

【讨论】:

    【解决方案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 或 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 循环版本,恕我直言。

    【讨论】:

    • +1.能不能提供一个函数式编程的例子
    【解决方案4】:

    具体说明您的问题:

    • 在 Scala 中,您可以进行模式匹配
    • scala 具有更高阶的函数(与 java8 lambda 不同,
    • 匿名函数字面量
    • 强类型推断
    • 懒惰评估
    • 方差注释
    • 更高种类的类型
    • 具有特征的混合行为(可堆叠组合)
    • 隐式定义和转换
    • xml 文字
    • REPL

    我可以继续,但我敦促您至少阅读一些文档。
    比如你可以开始here

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 2010-10-07
      • 2016-05-09
      • 2020-11-10
      • 1970-01-01
      • 2016-08-16
      • 2012-07-17
      • 2021-09-05
      相关资源
      最近更新 更多