gpt4 book ai didi

scala - 是否有一种内置的更优雅的方式来按元素类型过滤和映射集合?

转载 作者:行者123 更新时间:2023-12-04 22:17:15 25 4
gpt4 key购买 nike

如果我想缩小特定类型(例如 Iterable[A] )的所有元素的 String 范围,我可以这样做:

as filter { _.isInstanceOf[String] }

但是,显然需要将其用作 Iterable[String] ,这可以通过 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])

但我想知道是否有更好的内置机制被我忽略了。特别是因为能够将 List[A] 缩小到 List[String] 会很好,而不是像我的函数那样缩小到 Iterable[String]

最佳答案

isInstanceOf/asInstanceOf 的 Scala 语法糖是模式匹配:

as flatMap { case x: String => Some(x); case _ => None }

因为它使用 flatMap ,所以它通常应该返回您必须开始使用的相同集合。

在 Scala 2.8 上,有一个实验函数可以执行这种模式,在对象 PartialFunction 中定义。因此,在 Scala 2.8 上,您可以执行以下操作:
as flatMap (PartialFunction.condOpt(_ : Any) { case x: String => x })

这看起来更大,主要是因为我没有先导入该函数。但是,再说一次,在 Scala 2.8 上有一种更直接的方法来做到这一点:
as collect { case x: String => x }

关于scala - 是否有一种内置的更优雅的方式来按元素类型过滤和映射集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1488261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com