Runnable w Kotlinie jako lambda

Runnable w Kotlinie jako lambda
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • 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


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Charles_Ray
Sprawdź w IntelliJ :) IMO Kotlin nie wykorzystuje invokedynamic, wiec będzie tworzył anonimowe klasy (to musi chodzić na Androidzie).
Michał Sikora
Michał Sikora
@Charles_Ray: Półprawda ;). Kotlin nie korzysta z invokedynamic i Android sam z siebie nie może skorzystać, ale nie ma problemu, żeby bajtkod zawierał takie instrukcje, bo zostanie to zamienione przez D8 na odpowiednie klasy.
Charles_Ray
Możliwe, dzięki za poprawienie :) W sumie to nie sprawdzałem czy Kotlin w trybie kompilacji do Javy 8 nie generuje invokedynamic.
PL
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad rok
  • 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:około 17 lat
  • Ostatnio:około 15 godzin
  • Postów:1875
0

”Engineering is easy. People are hard.” Bill Coughran
Michał Sikora
Michał Sikora
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 4 lata
  • 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.