Scala:使用泛型进行收集
Scala : Collect with generics
给定以下场景
val items = List("a", "b", "c", 1, 2, 3, false, true)
def intItems = items.collect {case i : Int => i}
def stringItems = items.collect {case s : String => s}
有没有办法创建一个通用函数来处理这种行为?
我尝试了以下方法
def itemsAs[T]: List[T] = items.collect { case item: T => item }
但是
itemsAs[Int]
returns
List[Int]] = List(a, b, c, 1, 2, 3, false, true)
另一种方法是提供 partial function
作为参数,但仍然必须复制 case i: Int => i
和 case s: String => s
。有没有办法让它更紧凑?谢谢
val items = List("a", "b", "c", 1, 2, 3, false, true)
import scala.reflect.ClassTag
def collect[T: ClassTag] = items.collect { case x: T => x }
collect[Int] // List(1, 2, 3)
collect[String] // List(a, b, c)
有关详细信息,请参阅 http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html。
给定以下场景
val items = List("a", "b", "c", 1, 2, 3, false, true)
def intItems = items.collect {case i : Int => i}
def stringItems = items.collect {case s : String => s}
有没有办法创建一个通用函数来处理这种行为?
我尝试了以下方法
def itemsAs[T]: List[T] = items.collect { case item: T => item }
但是
itemsAs[Int]
returns
List[Int]] = List(a, b, c, 1, 2, 3, false, true)
另一种方法是提供 partial function
作为参数,但仍然必须复制 case i: Int => i
和 case s: String => s
。有没有办法让它更紧凑?谢谢
val items = List("a", "b", "c", 1, 2, 3, false, true)
import scala.reflect.ClassTag
def collect[T: ClassTag] = items.collect { case x: T => x }
collect[Int] // List(1, 2, 3)
collect[String] // List(a, b, c)
有关详细信息,请参阅 http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html。