繁体   English   中英

将代码块从Java传递到Scala对象

[英]Passing a block of code from Java to a Scala object

我在scala有一个通用实用程序,可以重试某段代码逻辑n次。

RetryCode.scala

object RetryCode {
    def retry[T](timesRetry: Int)(block: => T): T = {
        def doBlock() = block
        breakable {
            for (i <- 0 until timesRetry) {
                try {
                    ...
                    doBlock()
                } catch {
                    ...
                }
            }
        }
    }
}

Scala测试单元:

class RetryCodeTest {
    test("success on 1st retry") {
        var i = 0
        val result = retry(5) {
          i = i + 1
          i
        }
        assert(result==1)
    }
}

我想将此功能扩展到Java程序

private void myMethod(int x) {
    try {
        // Code block to Retry 10 times
        ...
    } catch(Exception ex) {
        System.out.println("Error: " + ex.getMessage());
    }
}

如何将Java 7代码块发送到Scala RetryCode对象?

Java看到的retry的签名是<T> T retry(int timesRetry, scala.Function0<T> block) 因此,您需要实例化一个Function0 ,但是直接在Java中对其进行扩展将无法正常工作。 相反,你想要

RetryCode.retry(10, new scala.runtime.AbstractFunction0<Integer> {
  @Override
  public Integer apply() { return something; }
});

(至少如果我没记错的话,静态方法是在RetryCodeRetryCode )。

注意,总的来说,您不能仅仅假设可以从Java合理地调用Scala API。 您可能需要为此编写一个包装器(在Scala中)。

我在Scala重写了Java 7程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM