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

我在
Scala中编写了一个库.现在,一些
Java程序员想要使用它.由于他们不熟悉Seq或ArrayBuffer等Scala集合,因此他们不习惯使用它.我需要对我的代码进行一些更改.

让我将我的实际问题简化为一个简单的类:

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程序员可能觉得不舒服.

我知道这样做的一种方法是导入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的方式.例如,参见JavaResults Scala类.

点赞