2012-05-18 11 views
11

Aby uzyskać zgodność operacyjną, muszę przekazać Scala PartialFunction z kodu Java. Dla funkcji (Function1 i tak dalej) istnieje funkcja AbstractFunction, którą mogę podklasować z anonimowym typem, ale jaki byłby najłatwiejszy sposób wykonania tego samego dla funkcji PartialFunction?Jaki jest najłatwiejszy sposób implementacji funkcji Scala PartialFunction w Javie?

W tym przypadku byłbym szczęśliwy, gdyby była to funkcja "kompletna" w Javie, która jest zdefiniowana dla wszystkich wartości, ale została wpisana jako funkcja częściowa.

Odpowiedz

9

Co chciałbym zrobić tutaj jest zapewnienie interfejs w języku Java, w jakiejś wspólnej biblioteki (co nie jest scala-aware):

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

Następnie w Scala (czyli biblioteki scala na utrzymaniu powyżej biblioteki Java), konwersja implementację to do 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 
    } 
    } 
} 

Następnie kod Java może to zrobić:

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

Jeśli nie podoba składni MyPartialFunctions$.MODULE$, możliwe w bibliotece scala klasa Java który ukrywa to od ciebie:

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

Potem rozmowa-site wygląda następująco:

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

Dotyczy to, hmm, kilku poziomów pośrednictwa!

+0

Rozważałem stworzenie opakowania/fabryki w Scali. Jednak w przypadku tego projektu nie mogę samodzielnie tworzyć kodu w Scali. – SoftMemes

Powiązane problemy