Вы не указываете, что хотите создать объект, реализующий интерфейс 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) }))
}