kotlin - 在 Kotlin 中否定谓词的简单方法(例如 (String) -> Boolean))

标签 kotlin

给定一个谓词(String) -> Boolean 我想知道是否有一种简单的方法来否定该谓词的结果。 只要我使用列表,我可以简单地从filter切换至 filterNot ,但是如果我有的话,比如说... a Map并使用filterKeys

到目前为止我使用的是:

val myPredicate : (String) -> Boolean = TODO()
val map : Map<String, String> = TODO()

map.filterKeys { !myPredicate(it) }

但我想知道为什么Collection有一个重载的过滤函数,但Map却没有。此外我还想知道,为什么没有类似于我们在Java中的东西,即Predicate.negate()自 Java 11 Predicate.not(..) .

或者它确实存在但我只是没有找到它?

最佳答案

当时我的方法是使用两个函数,一个使用 not 运算符,另一个是接受谓词的简单 not 函数。今天,我真的不能再推荐这种方法,但如果我必须再次处理键或值的许多谓词否定,我宁愿选择以下方法:

inline fun <K, V> Map<out K, V>.filterKeysNot(predicate: (K) -> Boolean) = filterKeys { !predicate(it) }
inline fun <K, V> Map<out K, V>.filterValuesNot(predicate: (V) -> Boolean) = filterValues { !predicate(it) }

这样,只需调用 filterKeysNot(givenPredicate) 即可使用给定谓词,类似于在集合上使用 filterNot 已经可以实现的功能。

对于当时遇到的问题,我能够进行重构,以便可以对数据进行适当的分区,因此不再需要谓词否定。

如果我只在极少数情况下需要它,我宁愿坚持使用 filterKeys { !predicate(it) }filterNot { (key, _) -> predicate(key) }.

以下变体显示了如何实现诸如 Predicates.notPredicate.negate 之类的内容:

以下内容将允许使用 ! 运算符来否定谓词(如果应允许多个参数,则需要适当的重载):

operator fun <T> ((T) -> Boolean).not() = { e : T -> !this(e) }

接下来允许使用not( {/* a predicate */} )。然而,至少对我来说,这并不是真正更具可读性:

inline fun <T> not(crossinline predicate: (T) -> Boolean)  = { e : T -> !predicate(e)}

用法:

val matchingHello : (String) -> Boolean = { it == "hello" }

mapOf("hello" to "world", "hi" to "everyone")
       .filterKeys(!matchingHello)
// or  .filterKeys(not(matchingHello))
// or  .filterKeys(matchingHello.not())
// or as shown above:
//     .filterKeysNot(matchingHello)
       .forEach(::println)   

关于kotlin - 在 Kotlin 中否定谓词的简单方法(例如 (String) -> Boolean)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057360/

相关文章:

android - 如果我在Firebase身份验证中使用Facebook登录,为什么我的currentUser始终为null?

kotlin - 运算符重载 Kotlin

android - Koin:如何降低模块的可见性(私有(private)非导出模块)

android - 如何调整我的代码以获取所需的屏幕截图,同时裁剪顶部和底部?

android - (取消)在 Android 服务中注册传感器监听器并不总是有效

kotlin - 如何在 Kotlin 中访问内部对象的成员

android - fragment 上的 constraintLayout 关键帧动画

android - 返回应用程序后触发 MutableStateFlow

android - Kotlin 编程语言的静态分析工具?

android - ViewModel发出多次而不是一次发出