Почему метод BiPredicate.test не отображается в Kotlin? - PullRequest
1 голос
/ 04 марта 2020
return VAL_MAP.getOrDefault(push.type, listOf { _: Push, _: SystemState -> false}.stream().allMatch ( { predicate -> predicate.test(push, systemState)}))

У меня есть строка, где Pu sh - это параметр уведомления pu sh, а systemtate - настройки системы, вам необходимо отфильтровать их. В Java код работает нормально. По какой-то причине kotlin ругается на отсутствие метода тестирования предикатов, в чем может быть проблема и как ее исправить? И возможно ли написать эквивалентный код, но не использовать BiPredicate?

1 Ответ

0 голосов
/ 04 марта 2020

Вы не указываете, что хотите создать объект, реализующий интерфейс BiPredicate. Вы создаете Kotlin функциональный объект, используя лямбда-синтаксис. Таким образом, он имеет тип (Push, SystemState) -> Boolean вместо типа BiPredicate. Это легко исправить: просто напишите BiPredicate{ ... } вместо { ... }.

Таким образом, ваш фиксированный код будет выглядеть как

return VAL_MAP.getOrDefault(push.type, listOf(BiPredicate { t: Push, u: SystemState -> false }).stream().allMatch({ predicate -> predicate.test(push, systemState) }))

Другая альтернатива - просто вызвать вместо этого функциональный объект как функцию использования интерфейса Java:

return VAL_MAP.getOrDefault(push.type, listOf { t: Push, u: SystemState -> false }.stream().allMatch({ predicate -> predicate(push, systemState) }))

Вот полный пример с заполнителями типа, чтобы продемонстрировать, что он возвращает логическое значение:

package test

import java.util.function.BiPredicate

class PushType
class Push {
    val type = PushType()
}

class SystemState

val VAL_MAP = hashMapOf<PushType, Boolean>()

fun f1(push: Push, systemState: SystemState): Boolean {
    return VAL_MAP.getOrDefault(push.type, listOf(BiPredicate { t: Push, u: SystemState -> false }).stream().allMatch({ predicate -> predicate.test(push, systemState) }))
}

fun f2(push: Push, systemState: SystemState): Boolean {
    return VAL_MAP.getOrDefault(push.type, listOf { t: Push, u: SystemState -> false }.stream().allMatch({ predicate -> predicate(push, systemState) }))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...