12

相互運用性のために、Java コードから Scala PartialFunction を渡す必要があります。関数 (Function1 など) には、匿名型でサブクラス化できる AbstractFunction がありますが、PartialFunction で同じことを行う最も簡単な方法は何でしょうか?

この場合、Java の「完全な」関数であり、すべての値に対して定義されているように見えますが、PartialFunction として型付けされていれば幸いです。

4

3 に答える 3

9

私がここで行うことは、いくつかの一般的なライブラリ (スカラ対応ではない) で 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$構文が気に入らない場合は、これを非表示にするJava クラスである scala ライブラリで可能です。

//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) { /* */ }
}

これには、いくつかのレベルの間接化が含まれます。

于 2012-05-18T10:43:00.483 に答える
6

Chris の回答を補完するものとして、Scala 2.10 ではこれを使用できます: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html

于 2012-05-18T10:52:04.963 に答える
6

Twitter Util ライブラリを使用できる場合、これ専用のクラスがあります: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/Function。 htmlは基本的に AbstractPartialFunction と同じソリューションです。

于 2012-05-18T13:35:38.517 に答える