gpt4 book ai didi

Scala:isInstanceOf 后跟 asInstanceOf

转载 作者:行者123 更新时间:2023-12-01 06:54:31 25 4
gpt4 key购买 nike

在我的团队中,我经常看到队友在写作

list.filter(_.isInstanceOf[T]).map(_.asInstanceOf[T])

但这对我来说似乎有点多余。

如果我们知道过滤列表中的所有内容都是 T 的实例那么我们为什么要这样明确地转换它呢?

我知道一种替代方法,即使用 match .

例如:
list.match {
case thing: T => Some(thing)
case _ => None
}

但这有一个缺点,那就是我们必须明确地说明一般情况。

所以,鉴于以上所有,我有两个问题:

1)还有另一种(更好的?)方法来做同样的事情吗?

2)如果不是,应该首选上述两个选项中的哪一个?

最佳答案

您可以使用 collect :

list collect {
case el: T => el
}

真正的类型才有效(当然,禁止类型删除):
scala> List(10, "foo", true) collect { case el: Int => el } 
res5: List[Int] = List(10)

但是,正如@YuvalItzchakov 所提到的,如果你想匹配一个抽象类型 T , 你必须有一个隐含的 ClassTag[T]在适用范围。

所以实现它的函数可能如下所示:
import scala.reflect.ClassTag

def filter[T: ClassTag](list: List[Any]): List[T] = list collect {
case el: T => el
}

并使用它:
scala> filter[Int](List(1, "foo", true))
res6: List[Int] = List(1)

scala> filter[String](List(1, "foo", true))
res7: List[String] = List(foo)
collect需要 PartialFunction ,所以你不应该提供通用案例。

但如果需要,您可以转换函数 A => Option[B]PartialFunction[A, B]Function.unlift .这是一个例子,同样使用 shapeless.Typeable解决类型删除:
import shapeless.Typeable
import shapeless.syntax.typeable._

def filter[T: Typeable](list: List[Any]): List[T] =
list collect Function.unlift(_.cast[T])

使用:
scala> filter[Option[Int]](List(Some(10), Some("foo"), true))
res9: List[Option[Int]] = List(Some(10))

关于Scala:isInstanceOf 后跟 asInstanceOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182839/

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