前几天我开始学习Scala。至于语言本身,我认为这很棒,没有任何问题。为了帮助我学习过程,我为自己设置了一个任务,从HTML页面下载,解析和索引文本。
在执行上述操作时,我发现自己不断深入研究现有的Java库。我发现我必须使用Java库:
1)打开连接 - java.net.URL
2)解析HTML(TagSoup - 因为普通的XML解析器无法处理最糟糕的HTML)
3)索引文本(Lucene)
鉴于我不得不依赖Java库来完成相当多的繁重工作,我不禁想知道是否值得我使用Scala开始,除了作为一个学习练习。这部分是由于需要一些额外的心理努力才能在两者之间进行映射,例如,字体[]的Scala类型不是直观明显的,因为Scala中的所有东西都是对象。这是额外的心理处理,可以使这个过程看起来有点笨拙。
是否还有其他人认为较少的第三方库(与Java相比)是在商业项目中使用Scala的障碍?
如果您可以调用现有的Java库,那么它是否重要,或者在代码库中必须跨越两种不同的语言会使其变得更难?
答案 0 :(得分:12)
我不太关心你的看法。 Java库通常是.jar文件(压缩的.class文件集)。你期望Scala库是什么?好吧,它将是一组压缩的.class文件。两种语言都编译为Java字节码!所以,回答你的问题:
是否有人认为较少的第三方库(与Java相比)是在商业项目中使用Scala的障碍?
不,不是真的。
如果您可以调用现有的Java库,那么它是否重要,或者在代码库中必须跨越两种不同的语言会使其变得更难?
如果您将java-library视为已编译的.jar文件,则不必跨越两种不同的语言。
编辑:当然,Scala有一个非常丰富的类型系统,编译的类文件无法充分利用。相反,Java字节码格式的大量有用库可能使Scala 更多比其他新的(现代阅读)语言更具吸引力。
答案 1 :(得分:5)
我推荐这篇文章(和模式):
每当Java库的接口在Scala中有点麻烦时,这是一种使它更方便,代码更优雅的好方法。这是一个非常简单的例子。我想在我的代码中一直使用Scala XML pretty打印机来返回格式良好的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放在一个包对象中。
答案 2 :(得分:4)
这实际上并不像看起来那样愚蠢和误导一个问题。关于Scala中库的一些事实: