Я просто добавил вспомогательные функции, которые позволяли мне легко преобразовывать функциональные интерфейсы Java в их аналог Kotlin, но помещали их в галочки (что я не люблю видеть в обычном коде Kotlin (в отличие от тестов);-)), например:
fun <T> `$consume`(consumer: Consumer<T>): (T) -> Unit = consumer::accept
fun <T, R> `$`(func: java.util.function.Function<T, R>): (T) -> R = func::apply
fun <T, U, R> `$`(func: java.util.function.BiFunction<T, U, R>): (T, U) -> R = func::apply
// etc.
Предполагая, что в Kotlin имеются следующие функции:
fun doSomething1(c : (String) -> Unit) : String = TODO()
fun doSomething2(f : (String) -> String) : String = TODO()
fun doSomething3(f : (String, String) -> String) : String = TODO()
Использование из Java может выглядеть следующим образом:
doSomething1($consume((e) -> System.out.println(e)));
doSomething2($((e) -> e + "ok"));
doSomething3($((e1, e2) -> String.join(", ", e1, e2)));
Обратите внимание, что я использовал $consume
, чтобы преодолеть неоднозначность относительно Function<T, R>
.Вы также можете использовать $
для потребителя, но тогда вам понадобятся либо фигурные скобки, либо вам придется привести его к Consumer<T>
-интерфейсу, чтобы использовать ссылки на методы, например:
doSomething1($((e) -> { System.out.println(e); }));
doSomething1($((Consumer<String>) System.out::println));
Основным преимуществом использования $
с обратными тиками является то, что в Kotlin вы, вероятно, не будете его использовать, поскольку его не так легко записать (кто начинает с обратных тиков при вызове функций?) И завершение кода.не предлагает это так просто.
Более того, $
-sign напрямую вызывается на стороне Java без проблем.
Может быть, вы хотите смешать свои функции перегрузки с этим, так что вы делаетене нужно реализовывать весь код перегрузки и помещать эти функции в свою собственную библиотеку, доступную для разработчиков Java?