2012-05-18 34 views
11

Để có khả năng tương tác, tôi cần phải chuyển Scala PartialFunction từ mã Java. Đối với hàm (Function1 và vân vân), có AbstractFunction mà tôi có thể phân lớp với một kiểu ẩn danh, nhưng cách nào dễ nhất để làm tương tự cho PartialFunction?Cách dễ nhất để thực hiện một Scala PartialFunction trong Java là gì?

Trong trường hợp này, tôi rất vui khi có chức năng "hoàn tất" trong Java, xuất hiện được xác định cho tất cả các giá trị, nhưng được nhập dưới dạng một phần chức năng.

Trả lời

9

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!

+0

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

Các vấn đề liên quan