Java 缺少第三方库是否会妨碍您使用Scala?
前几天我开始学习Scala。至于语言本身,我认为它很棒,一点问题都没有。为了帮助我的学习过程,我给自己设置了一个任务,从HTML页面下载、解析和索引文本 在做上述工作时,我发现自己一直在挖掘现有的Java库。我发现我必须使用Java库来: 1) 打开一个连接-java.net.URL 2) 解析HTML(TagSoup-因为普通的XML解析器不会处理格式最差的HTML) 3) 为文本编制索引(Lucene) 考虑到我不得不依赖Java库来完成大量繁重的工作,我不禁怀疑,除了作为一种学习练习之外,是否值得开始使用Scala。这在一定程度上是因为在两者之间映射需要一些额外的脑力劳动,例如,字节[]的Scala类型是什么并不直观,因为一切都是Scala中的对象。正是这种额外的心理过程让这个过程看起来有点笨拙 是否有人认为第三方库(与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库来完成大量繁重的工作,我不禁怀疑,除了作为一种学习练习之外,
如果您可以调用现有的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 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
}