Những gì tôi sẽ làm ở đây là cung cấp một giao diện trong Java, trong một số thư viện chung (mà không phải là 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);
}
Sau đó, trong scala (tức là một thư viện scala phụ thuộc vào trên thư viện Java), chuyển đổi một thực hiện này cho một người 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
}
}
}
Sau đó mã Java của bạn có thể làm điều này:
//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) { /* */ }
}
Nếu bạn không thích cú pháp MyPartialFunctions$.MODULE$
, nó có thể trong thư viện scala, một lớp Java mà giấu này từ bạn:
//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);
}
}
Sau đó gọi trang web của bạn trông như thế này:
//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) { /* */ }
}
Điều này liên quan đến, ahem, một vài mức độ gián tiếp!
Tôi đã cân nhắc tạo một số trình bao bọc/nhà máy ở Scala. Tuy nhiên, đối với dự án này, tôi không thể tự sản xuất bất kỳ mã nào trong Scala. – SoftMemes