0

クラスがあるとしましょう

case class User(id: Long, firstName: String, surName: String, password: String)

そして地図

var userMap = Map(
    1 -> User(1, "firstName1", "surName1", "1111"),
    2 -> User(2, "firstName2", "surName2", "2222"),
    3 -> User(3, "firstName3", "surName3", "3333")
)

そうすることで

userMap find { case (a,b) => b == (1, "firstName1", "surName1", "1111") } isDefined

その値があるかどうかはわかりますが、

たとえば、userMap に surName1 があるかどうか、それを変更する必要がある場合、そのような姓がない場合は true または false を返すにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

0
scala>  userMap.values.exists{ case User(_, surName1, _, _ ) => true }
res1: Boolean = true

ただし、変更を行う場合は、true を確認してから変更してください。それは不可欠な非スカラの考え方です。これを行うためのやや邪悪な方法を次に示します。

var changed = false
userMap map { x => x match {
    case (n, User(i, f, "surName1", p)) => {
      changed = true
      (n, User(i, f, "Appleyard", p))
    }
    case _ => x
  }
}

これが行うことは、「surName1」ユーザーが「Appleyards」に変更された userMap のコピーを返すことです (変更可能なマップを指定しない限り、userMap はおそらく不変であるため)。一致するユーザーが見つかった場合、副作用として「changed」が true に設定されます。副作用を利用しているため、私はこれを軽度の悪と呼んでいます。副作用を回避する非常に簡単な方法があります...

scala> newMap = userMap  map { x => x match {
    case (n, User(i, f, "surName1", p)) => {
      (n, User(i, f, "Appleyard", p))
    }
    case _ => x
  }
}

scala> newMap == userMap
res2: Boolean = false

さて、ここにもっと正式なものがあります

def surnameA2B(oldName: String, newName: String, m: Map[Int,User]): (Int, Map[Int,User]) = {
  val changed = m collect {
    case (n, User(i, f, s, p)) if s == oldName =>
      (n, User(i, f, newName, p))
  }
  (changed.size, m ++ changed)
}

surnameA2B("surName1", "Appleyard", userMap)
res1: (Int, Map[Int,User]) = (1,Map(1 -> User(1,firstName1,Appleyard,1111), 2 -> User(2,firstName2,surName2,2222), 3 -> User(3,firstName3,surName3,3333)))

一致する名前、置換名、およびユーザーマップを指定すると、変更されたユーザーの数と、変更が適用された新しいユーザーマップが返されます。0 は変更がないことを意味するため、カウントが 0 かどうかをテストするだけでブール値を導出できます。

条件をチェックし、それが true の場合はアクションを実行し、アクションに基づいて条件を設定することは、非常に必須であり、Scala 以外の方法です。実際、条件が真かどうかをチェックする必要はめったにありません。関数をチェーンして、B が完了した場合に A が自然に発生するようにできる場合 (必要に応じて、関連する B の反復ごとに発生する場合もあります)。Scala を使用すると、このアプローチを簡単に試すことができ、よりクリーンなコードになります。

于 2013-09-26T18:47:59.123 に答える