Из Kotlin вызвать метод Java, требующий параметр Function - PullRequest
0 голосов
/ 06 марта 2019

У меня проблемы с преобразованием этого куска Java в Kotlin:

Publishers.map(chain.proceed(request), response -> {
            if (request.getCookies().contains("SOME_VALUE")) { 
                response.cookie(request.getCookies().get(STATE_COOKIENAME).maxAge(0));
            }
            return response;
        });

Второй параметр метода map (примечание Publishers не является коллекцией) принимает Function<T,R>. Я пробовал несколько решений, в том числе обеспечение лямбда таким образом:

Publishers.map(chain?.proceed(request), {
        x: MutableHttpResponse<*>!,
        y: MutableHttpResponse<*>! -> print("It worked")
    })

но это приводит к:

Ошибка: (32, 38) Kotlin: неожиданный токен

Ошибка: (33, 38) Kotlin: неожиданный токен

Ошибка: (31, 27) Kotlin: Ошибка вывода типа: забавная карта (издатель: Издатель! Картограф: Функция!): Издатель! не может применяться к (Издатель>!>?, (MutableHttpResponse <>, MutableHttpResponse <*>) -> Unit)

Ошибка: (31, 56) Kotlin: Несоответствие типов: выводимый тип (MutableHttpResponse <<em>>, MutableHttpResponse <</em>>) -> Единица, но функция> !, MutableHttpResponse <>?>! ожидалось

и предоставление метода:

return Publishers.map(chain?.proceed(request), ::processCookie)

private fun processCookie(a: MutableHttpResponse<*>?) {
   print("something something something")
}

, что приводит к:

Ошибка: (31, 27) Kotlin: Ошибка вывода типа: забавная карта (издатель: Publisher !, mapper: Function!): Publisher! не может применяться к (Издатель>!> ?, KFunction1 <@ParameterName MutableHttpResponse <> ?, Unit>)

Ошибка: (31, 56) Kotlin: Несоответствие типов: выведенный тип - KFunction1 <@ParameterName MutableHttpResponse <> ?, Unit> but Function> !, MutableHttpResponse <*>?>! ожидалось

Для контекста я подумал, что было бы интересно попробовать этот урок на kotlin.

1 Ответ

2 голосов
/ 06 марта 2019

Вы не указываете тип возврата в лямбде, он выводится Котлином.Последний пример не сработал, потому что возвращаемый тип функции - Unit, что в Java равно void.Я бы попробовал следующее:

return Publishers.map(chain?.proceed(request), ::processCookie)

private fun processCookie(a: MutableHttpResponse<*>?) : MutableHttpResponse<*>? {
   print("something something something")
   return a
}

Это также может сработать, если вы напишите

return Publishers.map(chain?.proceed(request)) { 
  print("something something something")
  it
}

Мы используем здесь имя параметра по умолчанию для лямбды в Kotlin - а именно it.Компилятор Kotlin определит типы для вас.В Kotlin также разрешено перемещать последний лямбда-параметр функции за скобки.

Последнее для функциональных интерфейсов из Java, например Function<T,R>.Возможно, вам придется использовать имя явно, например,

return Publishers.map(chain?.proceed(request), Function<T,R> { 
  print("something something something")
  it
})

, где T и R должны быть заменены фактическими типами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...