例如,我想将 100500 字节读入一个数组:
byte[] array = new byte[100500];
int offset = 0;
ByteBuffer buf = ByteBuffer.directBuffer(4096);
channel.read(buffer, null, new LambdaAdapter((count, exception, attachment) -> {
buf.get(array, offset, count);
offset += count; //will not work, offset must be final
if (offset < 100500) {
channel.read(buffer, null, /*what here? must be lambda we are currently in but we can't use it!*/)
}
//here we have our 100500 bytes inside array
});
这里的 LambdaAdapter 是一个简单的包装器,它将 CompletionHandler 转换为具有三个参数的函数式接口。
反正。偏移量可以放在'attachment'参数中,lambda可以预先声明并作为字段重用。然而,生成的代码总是丑陋的丑陋的。
即使对于这样简单的任务,我也无法编写可接受的解决方案 - 对于读取与写入交错并包装在复杂逻辑中的复杂协议,它会是什么样子?
有谁知道处理异步 API 的合适方法?如果您认为 Scala 可以在这里拯救世界,请随意使用它。