Quelle est la façon la plus simple à mettre en œuvre un Scala PartialFunction en Java?

StackOverflow https://stackoverflow.com//questions/10650338

  •  11-12-2019
  •  | 
  •  

Question

Pour l'interopérabilité, j'ai besoin de passer un Scala PartialFunction à partir du code Java.Pour la Fonction (Fonction1 et ainsi de suite), il est AbstractFunction que je peux sous-classe avec un type anonyme, mais quelle serait la façon la plus simple de faire de même pour PartialFunction?

Dans ce cas, je serais heureux de l'avoir à l'être "complet" de la fonction en Java, apparaissant définie pour toutes les valeurs, mais de taper comme un PartialFunction.

Était-ce utile?

La solution

Si vous pouvez utiliser Twitter Util Bibliothèque, il a une classe spécifiquement pour cela: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function.HTML qui est fondamentalement la même solution que l'abstractpartialfunction.

Autres conseils

Ce que je voudrais faire ici est de fournir une interface en Java, dans certaines communes de la bibliothèque (ce qui n'est pas de la scala-connaissance):

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

Ensuite, en scala (c'est à direun scala dépendants de la bibliothèque sur le dessus de bibliothèque Java), de convertir une mise en œuvre de ce à un 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
    }
  }
}

Puis votre code Java peut faire ceci:

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

Si vous n'aimez pas le MyPartialFunctions$.MODULE$ syntaxe, c'est possible dans le scala bibliothèque, un La classe Java qui se cache de vous:

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

Ensuite, votre appel-le site ressemble à ceci:

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

Cela implique, ahem, quelques niveaux d'indirection!

En complément de la réponse de Chris, dans Scala 2.10, vous pouvez utiliser ceci: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/Runtime/abstractPartialfunction.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top