Как конвертировать Java лямбда на основе функционального интерфейса в Kotlin? - PullRequest
2 голосов
/ 08 июля 2019

У меня есть следующий функциональный интерфейс Java

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

У меня очень простая реализация интерфейса

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)))
    }
}

Но этот код недействителен.Я не понимаю, как реализовать тот же мир логики в Котлине.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы можете использовать SAM конструктор , чтобы указать интерфейс, который будет отображать ваша лямбда, например:

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)))
    }
}
0 голосов
/ 08 июля 2019

Вот правильный ответ на ваш вопрос:

fun printStringMessage(streamId: Int): FragmentHandler {
    val lambda = 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 lambda
}
...