【问题标题】:Is lack of 3rd party libraries preventing you using Scala?是否缺少 3rd 方库阻止您使用 Scala?
【发布时间】:2010-09-02 09:52:57
【问题描述】:

前几天我开始学习 Scala。至于语言本身,我认为它很棒,完全没有问题。为了帮助我的学习过程,我给自己设置了一个任务,从 HTML 页面下载、解析和索引文本。

在执行上述操作时,我发现自己不断地挖掘现有的 Java 库。我发现我必须使用 Java 库来:

1) 打开一个连接 - java.net.URL

2) 解析 HTML(TagSoup - 因为普通的 XML 解析器无法处理最糟糕的 HTML)

3) 索引文本(Lucene)

鉴于我不得不依赖 Java 库来完成很多繁重的工作,我不知道是否值得我一开始就使用 Scala,而不是作为学习练习。这部分是由于在两者之间进行映射需要一些额外的脑力劳动,例如,字节[] 的 Scala 类型是什么并不直观,因为在 Scala 中一切都是对象。正是这种额外的心理处理使这个过程看起来有点笨拙。

是否有人认为较少的 3rd 方库(与 Java 相比)是在商业项目中使用 Scala 的障碍?

如果您可以调用现有的 Java 库,这是否重要,或者必须在代码库中跨越两种不同的语言会使其更难?

【问题讨论】:

  • 争论和简单的愚蠢
  • 这并不是要争论,如果看起来那样道歉。

标签: java scala libraries


【解决方案1】:

我不太明白你的担心。 Java 库通常是一个 .jar 文件(压缩的 .class 文件集)。你希望 Scala 库是什么?好吧,这将是一组压缩的 .class 文件。两种语言都编译为 Java 字节码!所以,回答你的问题:

是否有人认为较少的 3rd 方库(与 Java 相比)是在商业项目中使用 Scala 的障碍?

不,不是。

如果您可以调用现有的 Java 库,这是否重要,或者必须在代码库中跨越两种不同的语言会使其更难?

如果您将 java 库视为已编译的 .jar 文件,则不必跨越两种不同的语言。


编辑:当然,Scala 有一个非常丰富的类型系统,编译的类文件无法充分利用它。相反,以 Java 字节码格式提供的大量有用库可能使 Scala 比其他新的(阅读现代的)语言更具吸引力。

【讨论】:

  • 首先,您必须在 Java API 调用与 Scala 等价物之间进行映射,例如,byte[] 的 Scala 类型并不直观,因为在 Scala 中一切都是对象。正是这种额外的心理处理使这个过程看起来有点笨拙。
  • 我同意这不是一个问题(如果他们立即可用的数千个优秀的 Java 库为使用 Scala 提供了一个很好的论据),但调用 Java 库不如调用具有支持 Scala 的接口的库。所以有一点语言障碍。
  • byte[] 的 Scala 类型是 Array[Byte]。 Scala 编译器可以编译这些类型,就好像它们是原始类型一样,并且只将它们装箱以在它们上运行非原始方法(例如filter)。
【解决方案2】:

我推荐这篇文章(和模式):

Pimp my Library

每当 Java 库的接口在 Scala 中有点繁琐时,这是一个很好的方法,可以让它更方便,代码更优雅。这是一个非常简单的例子。我想在我的代码中一直使用 Scala XML 漂亮的打印机来返回格式良好的 XML。这是正常的做法:

class Service {
val pp = new scala.xml.PrettyPrinter(80,2)
def content = 
  pp.format(<foo><bar>{something()}</bar></foo>)
}

但是由于我一直这样做,所以我将它添加到我的包中

import scala.xml.Elem

object PrettyXml {
  val pp = new scala.xml.PrettyPrinter(80,2)
}

trait PrettyXml {
  case class Formatted(xml:Elem) { 
    def pretty = PrettyXml.pp.format(xml) 
  }
  implicit def toFormatted(xml:Elem) = Formatted(xml)
}

现在我可以用

替换我的原始代码
class Service extends PrettyXML {
  val pp = new scala.xml.PrettyPrinter(80,2)
  def content = 
    <foo><bar>{something()}</bar></foo> pretty
}

如果我不想让它成为一个特征,我可能会将 PrettyXML 放在一个包对象中。

【讨论】:

    【解决方案3】:

    这实际上并不像看起来那样愚蠢和误导的问题。关于 Scala 库的一些事实:

    1. 如果没有 Java 库的庞大基础架构,大多数人将没有什么实际理由使用 Scala。 Scala 是一种可爱的语言,具有一些令人惊叹的特性,但如果每次需要完成任何大型任务时都必须重新发明轮子,那么没人会打扰。
    2. 从 Scala 访问本机 Java 库比从 Java 访问 Java 库更令人愉快,但只是稍微有点。这里的问题是本机 Java 库的级别远低于用 Scala 本地编写的库或 Java 库的良好 Scala 包装器。原生 Java 库往往充斥着单方法接口(应该是函数)、少量记录的可空参数或返回(应该是 Option)、不必要的并行类构造或“助手”(应该是 trait),手工制作的不完全标准的迭代器、try-block 要求的资源管理(由于缺少闭包)和类型签名(尤其是 Java-1.5 之前的库),这些都是可笑的粗糙。毫不奇怪,Scala 程序员将 Java 库视为“完成工作所必需的”,而不是您真正期待操纵的东西。
    3. 通过包装或拉皮条,实际上很容易获取 Java 原生库,并使其几乎与使用 Scala 原生库一样愉快。我预计大多数主要企业库的简单华丽的 Scala 适配器将在短期内可用。

    【讨论】:

    • 在您的脑海中,您能列举一些带有 Scala 适配器的流行 Java 库吗?只是好奇外面有什么......
    • 好吧,Scala-Swing 可能是最明显的一个,它随 scala 发行版一起提供。 Lift 和 Akka 都内置了很多适配器(redis、amqp、jta、jax-rs、couchdb、mongodb、cassandra)。我个人拥有 Ibatis、Freemarker、Quartz 和 Apache POI 的 Scala 包装器,我将其用于内部使用,并且可能很快就会完善并开源。
    猜你喜欢
    • 2023-04-10
    • 2015-09-08
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多