1

我有问题希望有人指导我可以在 Scala 中使用所有 Java 库,例如 Guava、Gson、Log4j、Spring、Hibernate 等吗?例如,我可以将下面的代码转换为 scala 吗?(番石榴库)

import com.google.common.base.Joiner;
public class mainJ {
    public static void main(String[] args) {
        String[] fantasyGenres = {"Space Opera", "Horror", "Magic realism", "Religion"};        
        String joined = Joiner.on(',').join(fantasyGenres);
        System.out.print(joined);
    }
}

我想选择 SCALA 作为主要编程语言,但我不知道是否可以在 scala 中不受限制地使用 Java 库?任何人都可以在 scala 中转换上述代码吗?谢谢

4

3 回答 3

9

根据Scala FAQ(强调添加):

标准的 Scala 后端是 Java VM。Scala 类是 Java 类,反之亦然。您可以从另一种语言的方法中调用任何一种语言的方法。您可以在 Scala 中扩展 Java 类,反之亦然。主要限制是一些 Scala 特性在 Java 中没有等价物,例如特征。

我是否需要将 Java 数据结构转换为 Scala,反之亦然?

您根本不需要转换 Java 数据结构就可以在 Scala 中使用它们。您可以“按原样”使用它们。例如,Scala 类可以继承 Java 类,您可以在 Scala 中实例化 Java 类,您可以访问方法、字段(即使它们是静态的)等。

于 2013-09-24T08:29:51.273 回答
5

正如其他人指出的那样,您可以轻松地在 Scala 中使用 Java 类。Gyro Gearless 和 maasg 在您的示例中展示了如何使用 Scala 的库来完成 Guava 的工作。显然,您也可以使用 Guava,以下是您可以更直接地将样本转换为 Scala 的方法:

import com.google.common.base.Joiner
import scala.collection.JavaConverters._

object MainJ extends App {
  val fantasyGeneres = Array("Space Opera", "Horror", "Magic realism", "Religion")
  val joined = Joiner.on(',').join(fantasyGeneres.toIterable.asJava)
  println(joined)
}

请注意,我曾经JavaConverters将 Scala 的版本转换Iterable为 Java 的版本,但这是唯一可以被视为不便之处。

于 2013-09-24T09:12:29.157 回答
4

是的,您可以在 Scala 中透明地使用 Java 类。但在 Scala 中,通常有一种惯用的方式可以更优雅地表达事物。对于您给定的示例,这可能是:

c:\opt>scala
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val fantasyGenres = List("Space Opera", "Horror", "Magic realism", "Religion")
fantasyGenres: List[String] = List(Space Opera, Horror, Magic realism, Religion)

scala> val joined = fantasyGenres.mkString(",")
joined: String = Space Opera,Horror,Magic realism,Religion
于 2013-09-24T08:58:46.163 回答