Frage

Für die Interoperabilität muss ich eine Scala-Teilfunktion aus Java-Code übergeben.Für Function (Function1 usw.) gibt es AbstractFunction , die ich mit einem anonymen Typ unterteilen kann, aber was wäre der einfachste Weg, dasselbe für PartialFunction zu tun?

In diesem Fall würde ich mich freuen, wenn es sich um eine "vollständige" Funktion in Java handelt, die für alle Werte definiert erscheint, aber als Teilfunktion eingegeben wird.

War es hilfreich?

Lösung

Wenn Sie die Twitter-Util-Bibliothek verwenden können, verfügt es über eine Klasse speziell dafür: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function.HTML , was grundsätzlich die gleiche Lösung wie abstraktepartialfunktion ist.

Andere Tipps

Was ich hier tun würde, ist eine Schnittstelle in Java bereitzustellen, in einer allgemeinen Bibliothek (die nicht scala-fähig ist):

//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);
}

Dann, in der scala (also.eine von der obigen Java-Bibliothek abhängige Scala-Bibliothek), konvertieren Sie eine Implementierung davon in eine 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
    }
  }
}

Dann kann Ihr Java-Code dies tun:

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

Wenn Ihnen das nicht gefällt MyPartialFunctions$.MODULE$ syntax, es ist möglich in der Scala-Bibliothek, ein Java-Klasse was das vor dir verbirgt:

//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);
    }
}

Dann sieht Ihre Call-Site so aus:

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

Dies beinhaltet, ähem, ein paar Ebenen der Indirektion!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top