由于您的域是有限的,我会选择这样的:
trait Risk extends Product with Serializable
object Risk {
def isUnacceptableRisk(risk: Risk): Boolean = risk match {
case UnacceptableRisk(_) => true
case _ => false
}
// Repeat for other types if needed.
}
final case class AcceptableRisk(name: String) extends Risk
final case class UnacceptableRisk(name: String) extends Risk
final case class UnknownRisk(name: String) extends Risk
然后你可以:seq.exists(Risk.isUnacceptableRisk)
可以使用typeclasses完成更通用的解决方案,如下所示:
trait Is[T] {
type U
def check(t: T): Boolean
}
object Is {
type Aux[T, _U] = Is[T] { type U = _U }
}
object syntax {
object is {
implicit class SeqOps[T](private val seq: Seq[T]) extends AnyVal {
def any[U <: T](implicit ev: Is.Aux[T, U]): Boolean =
seq.exists(ev.check)
}
}
}
trait Risk extends Product with Serializable
object Risk {
implicit final val IsUnacceptableRisk: Is.Aux[Risk, UnacceptableRisk] =
new Is[Risk] {
override type U = UnacceptableRisk
override def check(risk: Risk): Boolean = risk match {
case UnacceptableRisk(_) => true
case _ => false
}
}
// Repeat for other types if needed.
}
final case class AcceptableRisk(name: String) extends Risk
final case class UnacceptableRisk(name: String) extends Risk
final case class UnknownRisk(name: String) extends Risk
import syntax.is._
List(AcceptableRisk("foo"), UnacceptableRisk("bar")).any[UnacceptableRisk] // true.
但真诚的恕我直言,没有真正赢得太多的工作太多了。