Каков самый простой способ реализации Scala Partialfunction в Java?

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

  •  11-12-2019
  •  | 
  •  

Вопрос

Для совместимости, мне нужно пройти смазку частиалфункцию от кода Java.Для функции (функция1 и т. Д.) Существует абстрактная функция, которую я могу подкласс с анонимным типом, но какой был бы самый простой способ сделать то же самое для частичнойфункции?

В этом случае я был бы рад, что он будет иметь его «полную» функцию в Java, появляясь определенным для всех значений, но введенных в виде частичнойфункции.

Это было полезно?

Решение

Если вы можете использовать Twitter Util Biblic, у него есть класс специально для этого: 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);
}
.

Тогда, в Scala (то есть scala-библиотека, зависящая от вышеуказанной библиотеки Java), преобразуйте реализацию этого на генеракодицетагкод:

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

Если вам не нравится синтаксис PartialFunction, это возможно в библиотеке Scala , a java-класс , которые скрывают это от вас:

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

Это включает, Ahem, несколько уровней косвенности!

в качестве дополнения к ответу Криса, в 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