Java에서 Scala PartIalFunction을 구현하는 가장 쉬운 방법은 무엇입니까?

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

  •  11-12-2019
  •  | 
  •  

문제

상호 운용성에 대해서는 Java 코드에서 Scala PartIalFunction을 전달해야합니다.함수 (기능 1 등등)의 경우 익명 형식으로 서브 클래스 할 수있는 AbstractFunction이지만 부분 기능에 대해 동일한 작업을 수행하는 가장 쉬운 방법은 무엇입니까?

이 경우 Java의 "완전한"기능이되면 모든 값에 대해 정의되지만 부분적 기능으로 입력되는 기능을 갖게되어 기쁩니다.

도움이 되었습니까?

해결책

Twitter Util Library를 사용할 수있는 경우, http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function.HTML 기본적으로 AbstractPartialFunction과 동일한 솔루션입니다.

다른 팁

여기서 할 일은 일부 공통 라이브러리 (스칼라 인식가 아님)에서 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 (즉, 위의 Java 라이브러리에 의존적 인 스칼라 라이브러리) 에서이 구현을 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) { /* */ }
}
.

이것은 AHEM, 간접 수준의 몇 가지 수준을 포함합니다!

chris 답변을 보완함으로써 Scala 2.10에서는 다음을 사용할 수 있습니다. http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/hruntime/abstractPartialfunction.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top