例如,如果我想缩小Iterable[A]
特定类型(例如String
)的所有元素的范围,我可以这样做:
as filter { _.isInstanceOf[String] }
但是,显然希望将其用作Iterable[String]
可以通过 a 完成的操作map
:
as filter { _.isInstanceOf[String] } map { _.asInstanceOf[String] }
这很丑陋。当然我可以flatMap
改用:
as flatMap[String] { a =>
if (a.isInstanceOf[String])
Some(a.asInstanceOf[String])
else
None
}
但我不确定这是否更具可读性!我写了一个函数,narrow
,它可以通过implicit
转换来使用:
as.narrow(classOf[String])
但我想知道是否有一个我忽略的更好的内置机制。特别是因为能够将 a 缩小List[A]
到 a List[String]
,而不是Iterable[String]
像我的函数那样缩小到 a 会很好。