gpt4 book ai didi

scala - 使用动态过滤参数过滤列表

转载 作者:行者123 更新时间:2023-12-03 00:31:18 27 4
gpt4 key购买 nike

如果我有一个

case class User(var firstName: String, var lastName: String, var city: String)

和一个列表

val users = List(
new User("Peter", "Fox", "Berlin"),
new User("Otto", "Schmidt", "Berlin"),
new User("Carl", "Schmidt", "Berlin"),
new User("Hans", "Schmidt", "Berlin"),
new User("Hugo", "Schmidt", "Berlin"))

定义一些东西

val test1 = (user:User,key:String) => user.lastName.equals(key)
val test2 = (user:User,key:String) => user.firstName.startsWith(key)

和过滤器

val test = users.filter(u => {
test1(u,"Schmidt") && test2(u,"H")
})

这很好用。但是我怎样才能生成一些东西来动态过滤 test1, test2 ... testn 形成一个列表呢?我想要预定义很多过滤条件并将它们组合为一个条件(例如 test1(u,"Schmidt") && test2(u,"H"))来过滤我的列表并组合过滤顺序。

最佳答案

基本上,您想要的是一种组合谓词的方法。在这种情况下,谓词是一个接受 User 并返回 bool 值的函数。所以类型只是 User => Boolean

首先,我将重新表述您的“谓词生成器方法”,以便您可以生成谓词。在一些辅助对象内部:

object UserPredicates {
def lastNameEquals(value:String)(user:User) = user.lastName == value
def firstNameStartsWith(value:String)(user:User) = user.firstName.startsWith(value)
..
}

要生成以“H”开头的谓词firstName,您可以部分应用firstNameStartsWith方法,如下所示:

import UserPredicates._
val p1: User => Boolean = firstNameStartsWith("H")

然后,通过定义组合谓词的方法,从多个谓词创建谓词就非常简单了。也许也在 UserPredicates 中:

 def and(predicates:Seq[User => Boolean])(user:User) = predicates.forall(predicate => predicate(user))
def or(predicates:Seq[User => Boolean)(user:User) = predicates.exists(predicate => predicate(user))

然后你就可以了

import UserPredicates._
val condition1 = firstNameStartsWith("H")
val condition2 = lastNameEquals("Schmidt")
val combined = and(Seq(condition1, condition2))
users.filter(combined)

或者简短

users.filter(and(firstNameStartsWith("H"), lastNameEquals("Schmidt")))

.

顺便说一句:您不应该使用 new 来创建案例类实例。另外,您不必使用 equals 来比较字符串。 scala == 运算符将调用 equals,而不仅仅是像 java == 运算符那样检查引用相等性。

关于scala - 使用动态过滤参数过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791933/

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