Kotlin - не удалось найти котиновый эквивалент java .util.function. Function - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь преобразовать одну из функций java, которая принимает java.util.function.Function<T, R> в Kotlin, используя IDEA 2019.3 Kotlin мультиплатформенную библиотеку.

Но я не смог найти способ сделать эквивалентную функцию в kotlin. Я вижу здесь , что есть Function1 для обеспечения взаимодействия java, но я не могу выполнить импорт из import kotlin .jvm.functions. *

Я пытаюсь Kotlin в первый раз. Может кто-нибудь, пожалуйста, скажите, что я делаю неправильно.

Обновление - Пожалуйста, посмотрите мой java код

import java .util.function.Function;

public class A {
    Function<String, String> function;

    public A(Function<String, String> function) {
        super();
        this.function = function;
    }

public String convert(String input) {
    return function.apply(input);

}
}

Ответы [ 2 ]

1 голос
/ 06 января 2020

Непонятно по вашему вопросу, но при условии, что вы пытаетесь дублировать функциональность из Java:

В Kotlin вы не используете интерфейсы функций напрямую, потому что функции являются первоклассными. Function1, Function2, et c. классы используются только для того, чтобы сделать функции доступными для кода Java и JVM.

Если вы хотите создать эквивалент Java Function<T, R>, вы должны определить функцию, используя либо Kotlin ' s fun или лямбда-синтаксис.

fun getStringLength(x: String): Int {
    return x.length
}

//...
val functionReference = ::getStringLength
// Java code will treat this as a Function1<String, Int>

или

val function = fun (x: String): Int {
    return x.length
}
// Java code will treat this as a Function1<String, Int>

или

val functionReference = { x: String -> x.length }
// Java code will treat this as a Function1<String, Int>

Чтобы объявить, что функция принимает функцию в качестве параметра, вы используйте синтаксис (input) -> output в качестве типа переменной:

fun <T, R> doSomething(functionalReference: (T) -> R) {
    //
}

Вы можете вызвать функцию, используя ее ссылочное имя:

fun <T, R> doSomething(input: T, functionalReference: (T) -> R): R {
    return functionalReference(input)
}
1 голос
/ 06 января 2020

Звучит так, будто вы хотите преобразовать функцию Java, которая принимает функцию, в эквивалентную функцию Kotlin.

Пример:

Java

public class JavaFunctions {
   public static <T,R> void runAFunction(Function<T, R> userFunction){
      userFunction.apply(null);
   }
}

Kotlin (Эти две функции эквивалентны)

class KotlinFunctions{
   companion object{
      @JvmStatic
      fun <T,R> runAFunction(userFunction:(T?) -> R?){
         userFunction.invoke(null);
      }

      @JvmStatic
      fun <T,R> runAFunction2(userFunction: Function1<T?, R?> ){
         userFunction.invoke(null);
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...