3

もし私が持っていたら

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 を動的にフィルタリングするものを生成するにはどうすればよいでしょうか? 多くのフィルター条件を事前定義し、それらを 1 つの条件 (test1(u,"Schmidt") && test2(u,"H") など) に結合して、リストをフィルター処理し、フィルター処理の順序を結合したいと考えています。

4

2 に答える 2

1

この種の構文を取得できるように、暗黙を使用するのが好きです。

  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"))

  //Note that these are curried now
  val filterLastName = (key: String) => (user: User) => user.lastName.equals(key)
  val filterFirstNameFirstChars = (key: String) => (user: User) => user.firstName.startsWith(key)

  implicit class FilterHelper[A](l: List[A]) {
    def filter(filters: List[A => Boolean]): List[A] = {
      l.filter(a => filters.forall(f => f(a)))
    }
  }

  //implicit filter takes a list of user predicates
  val test = users.filter(List(
    filterLastName("Schmidt"),
    filterFirstNameFirstChars("H")))
于 2013-07-22T16:04:34.103 に答える