Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缺少第三方库是否会妨碍您使用Scala?_Java_Scala_Libraries - Fatal编程技术网

Java 缺少第三方库是否会妨碍您使用Scala?

Java 缺少第三方库是否会妨碍您使用Scala?,java,scala,libraries,Java,Scala,Libraries,前几天我开始学习Scala。至于语言本身,我认为它很棒,一点问题都没有。为了帮助我的学习过程,我给自己设置了一个任务,从HTML页面下载、解析和索引文本 在做上述工作时,我发现自己一直在挖掘现有的Java库。我发现我必须使用Java库来: 1) 打开一个连接-java.net.URL 2) 解析HTML(TagSoup-因为普通的XML解析器不会处理格式最差的HTML) 3) 为文本编制索引(Lucene) 考虑到我不得不依赖Java库来完成大量繁重的工作,我不禁怀疑,除了作为一种学习练习之外,

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

在做上述工作时,我发现自己一直在挖掘现有的Java库。我发现我必须使用Java库来:

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

2) 解析HTML(TagSoup-因为普通的XML解析器不会处理格式最差的HTML)

3) 为文本编制索引(Lucene)

考虑到我不得不依赖Java库来完成大量繁重的工作,我不禁怀疑,除了作为一种学习练习之外,是否值得开始使用Scala。这在一定程度上是因为在两者之间映射需要一些额外的脑力劳动,例如,字节[]的Scala类型是什么并不直观,因为一切都是Scala中的对象。正是这种额外的心理过程让这个过程看起来有点笨拙

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


如果您可以调用现有的Java库,这有关系吗?或者必须在一个代码库中跨两种不同的语言会使它变得更难吗?

我不太明白您的担忧。Java库通常是.jar文件(压缩的.class文件集)。您希望Scala库是什么?嗯,它将是一组压缩的.class文件。这两种语言都编译成Java字节码!因此,要回答您的问题:

还有人认为第三方库(与Java相比)的减少是在商业项目中使用Scala的障碍吗

不,不是真的

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

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


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

我推荐本文(和模式):

每当Java库有一个界面在Scala中有点麻烦时,这是一个使它更方便、代码更优雅的好方法。这里有一个非常简单的例子。我希望在代码中始终使用Scala XML漂亮打印机来返回格式良好的XML。这是正常的方法:

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

class Service extends PrettyXML {
  val pp = new scala.xml.PrettyPrinter(80,2)
  def content = 
    <foo><bar>{something()}</bar></foo> pretty
}
类服务扩展了PrettyXML{
val pp=new scala.xml.PrettyPrinter(80,2)
def内容=
{something()}很漂亮
}

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

这实际上并不像看上去那么愚蠢和误导。关于Scala中的库的一些事实:

  • 如果没有Java库的庞大基础设施,大多数人就没有什么实际理由使用Scala。Scala是一种可爱的语言,它有一些惊人的特性,但是如果每次你需要完成任何大的事情时都要重新发明轮子,没有人会费心
  • 从Scala访问本机Java库比从Java访问Java库稍微有趣一些,但只是稍微有趣一些。这里的问题是,本机Java库的级别远远低于用Scala本机编写的库或Java库的良好Scala包装器。本机Java库往往充斥着单一方法接口(应该是函数)、少量记录的可空参数或返回(应该是选项)、不必要的并行类构造或“助手”(应该是特征)、手工编写的不太标准的迭代器,尝试一下要求块的资源管理(由于缺少闭包)和类型签名(特别是Java-1.5之前的库),这些都是可笑的粗糙。Scala程序员将Java库视为“完成工作所必需的”,而不是您真正期待的操作,这并不奇怪
  • 通过包装或PIMP,获取Java本机库并使其与Scala本机库一样使用起来非常容易。我希望大多数主要企业库的Scala适配器在短期内都可以使用

  • 首先,您必须在Java API调用与Scala等价物之间进行映射,例如,字节[]的Scala类型直观上并不明显,因为一切都是Scala中的对象。正是这种额外的心理处理让这个过程看起来有点笨拙。我同意这不是一个问题(如果他们认为数千个优秀Java库的即时可用性是使用Scala的一个很好的理由的话),但是调用Java库不如调用具有Scala启用接口的库漂亮。因此有一点语言障碍。字节[]的Scala类型是Array[byte]。Scala编译器可以像编译原语一样编译这些类型,并且只对它们进行装箱以在其上运行非原语方法(例如
    filter
    )?只是好奇外面有什么…嗯,Scala Swing可能是最明显的一个,与Scala发行版一起发布。Lift和Akka都内置了很多适配器(redis、amqp、jta、jax rs、couchdb、mongodb、cassandra)。我个人有Ibatis、Freemarker、Quartz和ApachePOI的Scala包装,这些都是我为国际米兰设计的
    class Service extends PrettyXML {
      val pp = new scala.xml.PrettyPrinter(80,2)
      def content = 
        <foo><bar>{something()}</bar></foo> pretty
    }