6

从 JRuby 访问 Java 数据结构时,它们之间似乎有一些神奇的转换;它们看起来就像普通的红宝石地图和数组一样工作。但是,Scala 数据结构没有。在搜索 JRuby / Scala 互操作时,我发现很少。例如,您将如何迭代 ScalaMapList类型?

4

2 回答 2

4

你当然可以。但这有点绕圈子。对于列表:

require "/usr/share/scala/lib/scala-library.jar" # load the scala lib
Java::scala.collection.immutable::List.empty.send("::", 1)
  .map(lambda{|e|e+1},
        Java::scala.collection.immutable.List.canBuildFrom) # by lopex

现在你在 jruby 中有一个 scala 列表。您可以编写一些不错的 Ruby API 来为您填充隐式。

于 2013-02-03T05:10:27.243 回答
3

如果“迭代”是指使用 HOF(高阶函数),例如mapreduce、等filtercollect那么您将遇到麻烦。这是可能的,但是您在 Scala 中获得的语​​法优雅是因为编写函数文字非常容易。当您编写如下内容时,编译器正在为您做什么:

scala> val l1 = List(1, 2, 3)
l1: List[Int] = List(1, 2, 3)

scala> l1.map(i => i * i)
res0: List[Int] = List(1, 4, 9)

... 是创建并实例化一个子类,Function1[Int, Int]apply方法采用单个Int参数并评估函数文字 ( (i => i * i)) 的主体。

要使用任何接受函数的 Scala 方法,您必须这样做。就像是:

scala> class ISquaredF extends Function1[Int, Int] { def apply(i: Int) = i * i }
defined class ISquaredF

scala> (new ISquaredF)(5)
res1: Int = 25

scala> val isf1 = new ISquaredF
isf1: ISquaredF = <function1>

scala> l1.map(isf1)
res2: List[Int] = List(1, 4, 9)

总的来说,使用 Scala 中的 Java 库比使用任何其他 JVM 语言中的 Scala 代码要容易得多。这就是为什么像 Akka 这样想要同时支持 Scala 和 Java 客户端的系统有特殊的 Java API 来避开 Scala 语言的这些部分。

于 2013-02-03T04:07:11.630 回答