应该在Scala中编写Java应用程序的哪些部分?

Tod*_*wen 6 java interop scala

我正在使用Struts 2编写Java应用程序,但现在我想将它改为混合Java和Scala项目.我对Scala没有多少经验,但几年前我在大学时学过Haskell - 我真的很喜欢功能性编程范例,但当然在课堂上我们只能给出非常适合功能性解决方案的问题!在现实世界中,我认为一些代码更适合命令式样式,我想继续使用Java(我知道Scala支持命令式语法,但我还没准备好朝着纯Scala项目的方向发展) (还).

在混合项目中,如何决定用Java编写代码以及在Scala中编码什么?

Jor*_*tiz 10

两件事情:

  1. 99%的Java代码可以用Scala表示
  2. 您可以编写支持混合Java + Scala编译的项目.您的Scala代码可以调用您的Java代码,您的Java代码可以调用您的Scala代码.(如果你想做后者,我建议用Java定义接口,然后在Scala中实现它.否则,从Java调用Scala代码可能会有点难看.)

所以答案是:你想要的任何部分.您的Scala代码不需要纯粹功能.您的Scala代码可以调用Java库.所以你可以用Java编写的任何部分都可以用Scala编写.

现在,一些更实际的考虑因素.当第一次尝试使用Scala时,有些人会选择相对孤立的非任务关键部分来编写Scala.如果您喜欢这种方法,单元测试是一个很好的选择.

如果您熟悉Java并且过去曾学过Haskell,我建议将Scala视为"更好的Java".从根本上说,Scala编译为与Java输出非常非常相似的JVM字节码.唯一的区别是Scala更"高效":每行代码产生的字节码比Java更多.Scala与Haskell有很多共同之处(一等函数,for-comprehensions就像Haskell的do-notation,有限类型推理),但它也非常不同(默认情况下它不是懒惰的,它不是纯粹的).因此,您可以使用Haskell的一些见解来激发您的Scala风格,但"引擎盖下"它是所有Java字节码.


Dan*_*ral 6

根据您的问题的精神,我建议您在Scala中编写任何涉及对集合进行大量操作或处理XML的代码.

Scala的集合库是Scala最重要的功能特性,通过它的使用,您将体验到大量的LoC减少.是的,有Java备选方案,例如Google的集合库,但您询问了您应该在Scala中编写的内容.:-)

Scala还具有XML的本机处理功能.如果您尝试使用DOM代码并使其在Scala上运行,您可能会发现转换很困难.但是,如果您尝试解决问题和Scala透视图并从头开始为Scala编写,那么您将获得收益.

我也建议使用Actors,但我不确定你能用Java上的Struts 2代码集成它.但是如果你有并发代码,那就给Scala中的Actors一个想法吧.


Dav*_*haw 5

这可能听起来很愚蠢,但为什么不在Scala中编写整个项目?在保持对现有Java库的二进制兼容访问的同时,它是一种比Java更具表现力的出色语言.


Tim*_*ley 3

对您的项目提出以下问题:“哪些操作需要副作用?” 以及“Java 库已经很好地涵盖了哪些功能?” 然后在 Scala 中实现其余部分。

不过,我要警告的是,混合项目本质上比独立项目更困难,因为您需要使用多种语言/环境。因此,鉴于您声称对 Scala 没有太多经验,我建议您首先尝试一些玩具项目,也许是您完整目标的一部分。这也会让你感觉到分歧应该发生在哪里。