如何为我的 Scala 代码提供 Java 友好的界面?
How to provide a Java-friendly interface for my Scala code?
我用 Scala 编写了一个库。现在,一些 Java 程序员想要使用它。由于他们不熟悉 Seq
或 ArrayBuffer
等 Scala 集合,因此他们使用起来会很不自在。我需要对我的代码进行一些更改。
让我把我的实际问题简化为一个简单的class:
class Person(val name: String, val age: Int, val friends: Set[Person]) {
def friendNamesAndAges: ArrayBuffer[(String, Int)] =
friends.map(x => (x.name, x.age))[ArrayBuffer]
}
如何让我的 Java 用户在与 Person
对象交互时感到舒适?理想情况下,他们的代码看起来像
import java.util.HashSet;
import java.util.ArrayList;
...
Person somePerson = // some person
HashSet<Person> a = somePerson.friends();
ArrayList<Pair<String, Int>> b = somePerson.friendNamesAndAges();
然后他们就可以愉快地为所欲为,因为这些集合来自 Java 标准库。
我不想要的是:
import scala.*;
import scala.collection.immutable.Set;
import scala.collection.mutable.ArrayBuffer;
...
Person somePerson = // some person
Set<Person> a = somePerson.friends();
ArrayBuffer<Tuple2<String, Object>> b = somePerson.friendNamesAndAges();
Java 程序员可能感觉不舒服。
我知道的一种方法是 import scala.collection.JavaConverters._
,然后将 .asJava
添加到集合中。但我最终会得到两个同名函数,返回一个 Scala 集合和一个 Java 集合。此外,JavaConverters._
没有像我在示例中那样的元组转换器。
我有这个 Scala 代码:
javaf(b: ArrayList[Pair[String, Int]) =
scalaf(b.map(p => (p.getLeft, p.getRight))
然后 Java 人会打电话给 javaf
而 Scala 人会打电话给 scalaf
(在一个单独的地方)。
这正是 Play 在 Scala 中编写一些代码并提供 Java 友好 API 使用它的方式。例如参见 [=13=] Scala class.
我用 Scala 编写了一个库。现在,一些 Java 程序员想要使用它。由于他们不熟悉 Seq
或 ArrayBuffer
等 Scala 集合,因此他们使用起来会很不自在。我需要对我的代码进行一些更改。
让我把我的实际问题简化为一个简单的class:
class Person(val name: String, val age: Int, val friends: Set[Person]) {
def friendNamesAndAges: ArrayBuffer[(String, Int)] =
friends.map(x => (x.name, x.age))[ArrayBuffer]
}
如何让我的 Java 用户在与 Person
对象交互时感到舒适?理想情况下,他们的代码看起来像
import java.util.HashSet;
import java.util.ArrayList;
...
Person somePerson = // some person
HashSet<Person> a = somePerson.friends();
ArrayList<Pair<String, Int>> b = somePerson.friendNamesAndAges();
然后他们就可以愉快地为所欲为,因为这些集合来自 Java 标准库。
我不想要的是:
import scala.*;
import scala.collection.immutable.Set;
import scala.collection.mutable.ArrayBuffer;
...
Person somePerson = // some person
Set<Person> a = somePerson.friends();
ArrayBuffer<Tuple2<String, Object>> b = somePerson.friendNamesAndAges();
Java 程序员可能感觉不舒服。
我知道的一种方法是 import scala.collection.JavaConverters._
,然后将 .asJava
添加到集合中。但我最终会得到两个同名函数,返回一个 Scala 集合和一个 Java 集合。此外,JavaConverters._
没有像我在示例中那样的元组转换器。
我有这个 Scala 代码:
javaf(b: ArrayList[Pair[String, Int]) =
scalaf(b.map(p => (p.getLeft, p.getRight))
然后 Java 人会打电话给 javaf
而 Scala 人会打电话给 scalaf
(在一个单独的地方)。
这正是 Play 在 Scala 中编写一些代码并提供 Java 友好 API 使用它的方式。例如参见 [=13=] Scala class.