سؤال

من أجل قابلية التشغيل البيني، أحتاج إلى تمرير Scala PartialFunction من كود Java.بالنسبة للوظيفة (Function1 وما إلى ذلك)، هناك AbstractFunction التي يمكنني تصنيفها فرعيًا بنوع مجهول، ولكن ما هي أسهل طريقة لفعل الشيء نفسه بالنسبة إلى PartialFunction؟

في هذه الحالة، سأكون سعيدًا بأن تكون وظيفة "كاملة" في Java، بحيث تظهر محددة لجميع القيم، ولكن مكتوبة كدالة جزئية.

هل كانت مفيدة؟

المحلول

إذا كنت تستطيع استخدام مكتبة Twitter Util، فهذا يحتوي على فئة خصيصا لهذا: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function.HTML وهو نفس الحل الأساسي مثل التزلجاتالهلالفي.

نصائح أخرى

ما سأفعله هنا هو توفير واجهة في Java، في بعض المكتبات الشائعة (التي لا تدرك سكالا):

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

ثم، في سكالا (أي.مكتبة سكالا تعتمد على مكتبة جافا المذكورة أعلاه)، قم بتحويل تطبيق هذا إلى ملف 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
    }
  }
}

ثم يمكن لكود Java الخاص بك القيام بذلك:

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

إذا كنت لا تحب MyPartialFunctions$.MODULE$ بناء الجملة، فمن الممكن في مكتبة سكالا, ، أ فئة جافا الذي يخفي عنك هذا:

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

ثم يبدو موقع الاتصال الخاص بك كما يلي:

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

وهذا ينطوي، مهم، على مستويات قليلة من المراوغة!

ككمل لإجابة كريس، في SCALA 2.10، يمكنك استخدام هذا: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/abstractpartialfunction.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top