gpt4 book ai didi

kotlin - 为什么 BiPredicate.test 方法在 Kotlin 中不可见?

转载 作者:行者123 更新时间:2023-12-02 13:44:12 26 4
gpt4 key购买 nike

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

我有一条线,其中 Push 是推送通知参数,而 systemstate 是系统设置,您需要将它们过滤掉。在 Java 中,代码运行良好。出于某种原因,kotlin 发誓缺少谓词测试方法,可能是什么问题以及如何解决?是否可以编写等效代码,但不能使用 BiPredicate?

最佳答案

您没有指定要创建实现 BiPredicate 接口(interface)的对象。您正在使用 lambda 语法创建 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 接口(interface):
return VAL_MAP.getOrDefault(push.type, listOf { t: Push, u: SystemState -> false }.stream().allMatch({ predicate -> predicate(push, systemState) }))

这是带有类型占位符的完整示例,以证明它返回 bool 值:
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) }))
}

关于kotlin - 为什么 BiPredicate.test 方法在 Kotlin 中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60521588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com