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 を使用すると、このアプローチを簡単に試すことができ、よりクリーンなコードになります。