JavaではScala部分関数を実装する最も簡単な方法は何ですか?
-
11-12-2019 - |
質問
相互運用性の場合は、Scala CodeからScalaの部分関数を渡す必要があります。関数(function1など)の場合、匿名型でサブクラス化できる抽象関数がありますが、部分関数のために同じ方法が最も簡単な方法ですか?
この場合は、Javaの「完全な」機能であることが嬉しく思います。
解決
Twitter utilライブラリを使用できる場合は、これに特別なクラスがあります。
他のヒント
ここですることは、いくつかの一般的なライブラリ(Scala対応ではない)で、Javaのインタフェースを提供するものです。
//this is Java - in the Java lib
abstract class PartialTransformer<I, O> {
abstract public boolean isDefinedAt(I i);
public O transform(I i) {
if (isDefinedAt(i)) {
return transform0(i);
}
return null;
}
abstract protected O transform0(I i);
}
.
その後、Scala (すなわち、上記のJavaライブラリに依存するScalaライブラリ)で、これの実装をPartialFunction
:に変換します。
//this is scala - in the scala lib
object MyPartialFunctions {
def fromPartialTransformer[I, O](t: PartialTransformer[I, O]) = new PartialFunction[I, O] {
def isDefinedAt(i: I) = t isDefinedAt i
def apply(i: I) = {
val r = t transform i
if (r eq null) throw new MatchError
else r
}
}
}
.
それからあなたのJavaコードはこれを実行することができます:
//This is Java - in your client code
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer<Integer, String>() {
@Override public boolean isDefinedAt(Integer i) { /* */ }
@Override protected String transform0(Integer i) { /* */ }
}
.
MyPartialFunctions$.MODULE$
構文が気に入らない場合は、Scala Library で、これを非表示にする Javaクラス:
.
//This is Java - in the scala-lib
public class ScalaUtils {
public <I, O> scala.PartialFunction<I, O> toPartialFunction(PartialTransformer<I, O> t) {
MyPartialFunctions$.MODULE$.fromPartialTransformer(t);
}
}
それからあなたの呼び出しサイトは次のようになります:
.
//This is Java - in your client code
ScalaUtils.toPartialFunction(new PartialTransformer<Integer, String>() {
@Override public boolean isDefinedAt(Integer i) { /* */ }
@Override protected String transform0(Integer i) { /* */ }
}
これは、AHEM、数レベルの間接的なレベルです!
Chrisの答えを補完するように、Scala 2.10では、これを使用できます。