缺乏第三方库是否阻止您使用Scala?

3
我前几天开始学习Scala。就语言本身而言,我认为它很棒,没有任何问题。为了帮助我的学习过程,我设定了一个任务,即从HTML页面下载、解析和索引文本。
在上述过程中,我发现自己不断地深入研究现有的Java库。我发现我不得不使用Java库来:
1)打开连接 - java.net.URL
2)解析HTML(TagSoup - 因为普通的XML解析器无法处理大多数格式不良的HTML)
3)索引文本(Lucene)
考虑到我不得不依赖Java库来完成相当多的重活,我开始怀疑是否值得我使用Scala,除了作为一项学习练习之外。这部分是由于需要进行额外的心理努力来映射两者之间的关系,例如,在Scala中byte[]的类型不是直观的,因为Scala中的所有东西都是对象。正是这种额外的心理处理可能使整个过程显得有些笨拙。 是否有其他人认为Scala在商业项目中使用的第三方库比Java少是一个障碍? 如果您可以调用现有的Java库,那还有什么关系,或者在代码库中跨越两种不同的语言会让它变得更加困难?

争论性和毫无意义 - Kim Stebel
1
这并不是要争辩,如果看起来是这样的话请原谅。 - Joel
3个回答

12
我不太理解您的关注点。Java库通常是一个.jar文件(一组压缩的.class文件)。您希望Scala库是什么?它也会是一组压缩的.class文件。这两种语言都编译成Java字节码!所以,回答您的问题:

与Java相比,更少的第三方库是否是在商业项目中使用Scala的障碍?

不,实际上并不是。

如果您可以调用现有的Java库,那么这是否重要?或者跨两种不同的语言对代码库有影响吗?

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


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


1
首先,您需要在Java API调用和Scala等效调用之间进行映射。例如,在Scala中,byte[]的类型并不直观,因为Scala中的所有内容都是对象。这种额外的思维过程可能会使整个过程看起来有些笨拙。 - Joel
2
我同意这不是一个问题(如果有什么问题,成千上万优秀的Java库的即时可用性为使用Scala提供了很好的理由),但是调用Java库并不像调用具有Scala启用接口的库那样美观。因此存在一定的语言障碍。 - Thilo
4
在Scala中,byte[]的类型是Array[Byte]。Scala编译器可以将这些类型编译为原语类型,并仅在需要运行非原语方法(如“filter”)时对它们进行装箱处理。 - user382157

5

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

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放在一个包对象中。

4

这其实不是一个愚蠢和误导的问题。以下是关于Scala库的一些真相:

  1. 如果没有Java庞大的基础设施,大多数人使用Scala就没有太多实际理由。Scala是一门可爱的语言,具有一些惊人的特性,但如果每次需要完成任何大型任务时都必须重新发明轮子,那么没有人会费心去做。
  2. 从Scala访问本地Java库比从Java访问Java库略微更加愉快,但只是略微如此。问题在于本地Java库要比Scala本地编写的库或良好的Java库Scala包装器低级得多。本地Java库往往充斥着单方法接口(应该是函数)、轻度文档化的可空参数或返回值(应该是Option)、不必要的并行类构造或“助手”(应该是特质)、手工不太标准的迭代器、try块需求资源管理(因为缺少闭包)和类型签名(特别是对于Java 1.5之前的库),这些都显得非常粗糙。毫不奇怪,Scala程序员将Java库视为“完成工作所必需的”,而不是你真正期待操作的东西。
  3. 通过包装或增强,将Java本地库变得几乎和Scala本地库一样愉快使用实际上非常容易。我期望在不久的将来会有绝大多数主要企业库的漂亮Scala适配器可用。

你能否脱口而出一些带有Scala适配器的流行Java库?只是好奇想知道有哪些... - Zsolt Török
Scala-Swing可能是最明显的一个,它随Scala分发。Lift和Akka都内置了许多适配器(redis、amqp、jta、jax-rs、couchdb、mongodb、cassandra)。我个人为Ibatis、Freemarker、Quartz和Apache POI编写了Scala包装器,用于内部使用,很快就会进行优化并开源。 - Dave Griffith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接