Runnable w Kotlinie jako lambda

Runnable w Kotlinie jako lambda
S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 3573
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:

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

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

Kopiuj
        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ą:

Kopiuj
        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

PL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1909
Michał Sikora
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 834
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).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.