java - 如何将基于函数式接口(interface)的 Java lambda 转换为 Kotlin lambda?

标签 java kotlin functional-programming

我有下一个java功能接口(interface)

@FunctionalInterface
public interface FragmentHandler {
     void onFragment(DirectBuffer buffer, int offset, int length, Header header);
}

我有一个非常简单的接口(interface)实现

public static FragmentHandler printStringMessage(int streamId) {
    return (buffer, offset, length, header) -> {
        byte[] data = new byte[length];
        buffer.getBytes(offset, data);
        System.out.println(String.format("Message to stream %d from session %d (%d@%d) <<%s>>", streamId, header.sessionId(), length, offset, new String(data)));
    };
}

我想使用 Kotlin 编写相同的结构

fun printStringMessage(streamId: Int): FragmentHandler {
    val lambda: (DirectBuffer, Int, Int, Header) -> Unit = { buffer: DirectBuffer, length: Int, offset: Int, header: Header ->
        val data = ByteArray(length)
        buffer.getBytes(offset, data)
        println(String.format("Message to stream %d from session %d (%d@%d) <<%s>>", streamId, header.sessionId(), length, offset, String(data)))
    }
}

但是此代码无效。我不明白如何在 Kotlin 中实现同样的逻辑和平。

最佳答案

您可以使用 SAM constructor指定您希望 lambda 表示的接口(interface),如下所示:

fun printStringMessage(streamId: Int): FragmentHandler {
    val fragmentHandler = FragmentHandler { buffer: DirectBuffer, length: Int, offset: Int, header: Header ->
        val data = ByteArray(length)
        buffer.getBytes(offset, data)
        println(String.format("Message to stream %d from session %d (%d@%d) <<%s>>", streamId, header.sessionId(), length, offset, String(data)))
    }
    return fragmentHandler
}

如果您愿意,这还允许您省略参数中的显式类型,而且您当然可以直接返回实例:

fun printStringMessage(streamId: Int): FragmentHandler {
    return FragmentHandler { buffer, length, offset, header ->
        val data = ByteArray(length)
        buffer.getBytes(offset, data)
        println(String.format("Message to stream %d from session %d (%d@%d) <<%s>>", streamId, header.sessionId(), length, offset, String(data)))
    }
}

关于java - 如何将基于函数式接口(interface)的 Java lambda 转换为 Kotlin lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940554/

相关文章:

java - TestNG 并行 DataProvider

android - kotlin如何使用coroutine scope调用web服务和处理错误

java - 在Kotlin/Java中将列表过滤到特定大小

haskell - 第一次尝试 Haskell : Converting lower case letters to upper case

functional-programming - 逻辑编程的最佳用途是什么?

java - Eclipse 未从中央 Maven 存储库下载插件

java - 将项目集合提供给 java FXML 中的自定义扩展组合框

java - JApplet 代码在嵌入时运行

generics - 浮点和 double 的 Kotlin 通用函数

JavaScript `reduce` 性能