如何将参数声明为没有返回值的函数?

时间:2017-07-05 08:25:18

标签: kotlin

我在kotlin中有一个函数

fun printExecutionTime(block: () -> Any) {
    run {
        val currentTimeMillis = System.currentTimeMillis()
        block()
        Logr.d("Execution time of " + block.javaClass.name + " -> " + System.currentTimeMillis().minus(currentTimeMillis))
    }
}

在java代码中,我想将void引用函数作为参数传递,但不能返回bcs的返回值

PerformanceKt.printExecutionTime(this::voidFunc);

一种方法是使用界面

interface Action {
    fun call()
}

是否可以在没有额外接口的情况下在kotlin中声明它,所以上面的代码可以工作?

3 个答案:

答案 0 :(得分:5)

您是否尝试过使用Unit

fun f(voidFunc: () -> Unit) {
    // <...>
}

upd:经过一些谷歌搜索后,我应该承认,这个解决方案不适合你。这是一个开放的issue,涵盖 Java 方法引用与 Kotlin 功能类型的使用。

但是,仍然需要在 Java 中使用解决方法(看起来很难看,是的):

public Unit voidFunc() {
    // <...>
    return null;
}

答案 1 :(得分:0)

您可以使用java.lang.Runnable来避免引入其他界面,例如:

fun printExecutionTime(block: Runnable) {
  run {
    val currentTimeMillis = System.currentTimeMillis()
    block.run()
    //...
  }
}

然后你可以使用java方法引用表达式如下:

PerformanceKt.printExecutionTime(this::voidFunc);

void voidFunc(){...}

答案 2 :(得分:0)

如果我也必须在Java代码中使用该功能,我将使用RunnableConsumer (否则,我将使用Unit其他答案)

fun doIt(person:Consumer<String>, action: Runnable){
    person.accept("A message")
    action.run();
}