如何为我的 Scala 代码提供 Java 友好的界面?

How to provide a Java-friendly interface for my Scala code?

我用 Scala 编写了一个库。现在,一些 Java 程序员想要使用它。由于他们不熟悉 SeqArrayBuffer 等 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.