Runnable w Kotlinie jako lambda

0

Cześć mam taki interesujący problem.
Jest taki interface w Javie jak JavaMailSender,i ma metodę send która zwraca voida. Chce napisac kod w Kotlinie który odpali tą funkcje z użyciem CompletableFuture.
Moja zagwodzka jest związana z tym:

        return CompletableFuture.runAsync { mailSender.send(mapToSpringMessage(message))}

Nie pokazuje żadnych błędow, ale już

        return CompletableFuture.runAsync ({ mailSender.send(mapToSpringMessage(message))}, executorService)

powoduje że IntelliJ sie rzuca: Type mismatch: excepted Runnable!, found () -> Unit
Z czego to wynika? Wiem że jak wstawie Runnable przed lamdą:

        return CompletableFuture.runAsync ( Runnable { mailSender.send(mapToSpringMessage(message))}, executorService)

To jest ok. Ale czy wtedy nie ma gorszego performance? Czy to Runnable oznacza tworzenie anonimowej klasy?
@jarekr000000 @Michał Sikora

1

runAsync w Kotlinie jest dostępny z takimi argumentami:
screenshot-20200704143931.png

U siebie w pierwszym przypadku użyłeś trzeciej wersji. Natomiast w drugim przypadku pomieszałeś wersję drugą i czwartą. Ważne jest, że Unit w Kotlinie to nie to samo co void w Javie.

1

W Kotlinie, póki co, nie ma znaczenia czy przekazujesz Runnable { } czy { }, bo Kotlin nie korzysta z invokedynamic (https://youtrack.jetbrains.com/issue/KT-26060).

1 użytkowników online, w tym zalogowanych: 0, gości: 1