Java Scala的好处是什么?

Java Scala的好处是什么?,java,scala,Java,Scala,我是一名Java开发人员,我想知道如何在Java程序中使用Scala?阅读Scala。使用Scala,您可以保持: 所有Java库 在JVM上运行的所有优点(普遍性、管理工具、评测、垃圾收集等) 但您可以编写Scala代码: 比Java更简洁、更清晰(特别是使用更多功能性样式,如在集合库中) 它作为语言的一部分具有闭包和函数 它有操作符重载(从使用角度看) 它有mixin(即包含实现的接口) 我不确定您是否可以在Java程序中轻松使用Scala,如“从Java类调用Scala类” 您可以根

我是一名Java开发人员,我想知道如何在Java程序中使用Scala?

阅读Scala。使用Scala,您可以保持:

  • 所有Java库
  • 在JVM上运行的所有优点(普遍性、管理工具、评测、垃圾收集等)
但您可以编写Scala代码:

  • 比Java更简洁、更清晰(特别是使用更多功能性样式,如在集合库中)
  • 它作为语言的一部分具有闭包和函数
  • 它有操作符重载(从使用角度看)
  • 它有mixin(即包含实现的接口)

我不确定您是否可以在Java程序中轻松使用Scala,如“从Java类调用Scala类”

您可以根据文章“”进行尝试。
相关摘录:

问题是Java和Scala编译步骤是分开的:不能一次编译Java和Scala文件。
如果没有任何Java文件引用任何Scala类,则可以先编译所有Java类,然后再编译Scala类。
或者,如果您的Scala文件中没有引用任何Java类,您可以用另一种方法来实现。
但是,如果您希望Java类能够访问Scala类,并且Scala类能够访问Java类,那么这就是一个问题

Scala代码可以轻松地直接调用到Java代码中,但有时从Java代码中调用Scala代码更为棘手,因为从Scala到字节码的转换并不像Java那样简单:
有时,Scala编译器会向符号添加字符或进行其他更改,这些更改在从Java调用时必须显式处理。
但是Scala类可以实现Java接口,并且该类的实例可以传递给需要该接口实例的Java方法。
然后,Java类调用该实例上的接口方法,就像它是Java类实例一样


当然,相反的情况是可能的,如中所述。

另外,请查看Scala网站上最近发布的这条新闻: “”

在他的论文中,描述了他如何使用眼动跟踪研究编程风格的两个方面。他发现,与Java的迭代while循环相比,理解用于理解和映射(如Scala)的算法平均要快30%

还有一条新闻的关键引语:

亚历克斯·麦奎尔(Alex McGuire)在Scala中为电力交易公司编写任务关键型项目,他谈到Scala时说“简洁意味着我可以在一个屏幕上看到更多的节目。你可以得到一个更好的概述。当我有一些数学模型要用Java编写时,我必须在头脑中保留两个模型,一个是数学模型本身,另一个是如何用Java实现它的模型。有了Scala one模型,数学模型就可以了。生产效率更高。”


您可以阅读文章的其余部分和其他链接项。

2019年更新

根据我有限的经验,我可以用通俗易懂的语言说出一些简单的观点:

  • 财产。C++和java有一个公共吸收器/设置函数“属性”的概念,它围绕一个内部类变量,导致大量的样板代码。C#将其形式化为真正的语言特性,并使用自动实现的属性减少了C#3.0中的许多样板文件。Scala类仅将普通属性定义为常规只读VAL或读/写VAR。该类以后可能会选择使用get或get/set方法替换这些方法,而不会影响客户端代码。为此,Scala以最少的语言特性和复杂性提供了最优雅的解决方案

  • 数组使用常规泛型。在Java/C#中,
    int[]
    List
    List
    相比是多余的和令人困惑的。更糟糕的是,在Java中,
    List
    有很多运行时开销,因此许多开发人员必须知道如何使用
    int[]
    。Scala避免了这个问题。此外,在Java/C#中,数组支持(协变)强制转换,这是一个错误,由于遗留问题,它们现在无法修复

  • Scala对不变性有更好的支持
    val
    是一种基本的语言功能

  • Scala允许if块、屈服循环和大括号中的代码返回一个值。这在很多情况下都非常优雅。一个很小的优点是,这样就不需要单独的三元运算符

  • Scala有单例对象,而不是C++/Java/C#静态类。这是一种更清洁的解决方案

  • 模式匹配。对象解包。在很多情况下都很好

  • 原生元组

  • “case类”,大多数其他语言称之为记录类型或命名元组

  • 更华丽的标准图书馆,收藏更优雅

  • 多行字符串。字符串插值格式

  • 可选分号

  • 犯人

  • Java已经赶上了很多。Java8于2014年首次发布,但花了几年时间才逐步淘汰较旧的Java版本,并在整个Java生态系统中充分使用新的Java8功能。现在,lambda和闭包以及支持filter/map/fold的基本函数集合对于Java生态系统来说是相当标准的。最近,Java添加了基本的
    var
    局部变量类型推断,并在发布版本预览模式下具有多行字符串和开关表达式

  • Scala很复杂。我要强调的是,像
    implicits
    这样的特性本质上是令人困惑的

  • Scala具有最小的向后兼容性。Scala 2.10工件与Scala 2.11不兼容

  • 为其他JVM语言开发人员(如Scala、Clojure或Kotlin)构建JavaAPI是正常的、得到良好支持和接受的。你通常不想建造