类型参数方法
scala 中的方法可以接受一个或多个s ,type parameter就像 a或一样。classobjecttrait
在这种情况下,这意味着可以为一个类型调用相同的方法,该类型T可能因调用而异,但必须在定义中保持一致。
让我们使用例如
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]
该方法希望您传递:
- an Iterableof Ts ( unfiltered)
- 一个将 a 转换T为 a Boolean( predicate)的函数,
结果将是另一个Iterables T。
然后该方法将在unfiltered对象上进行迭代,并为每个元素应用predicate, 来决定是否必须对其进行过滤。
结果Iterable仅包含满足的元素predicate(即t返回的元素predicate(t))true
您可以为任何类型调用过滤器T,但约束条件是所有参数和结果类型必须保持一致。
例子
//filtered is List(2,3)
val filtered: Iterable[Int] = filter(List(1, 2, 3), (i: Int) => i > 1)
//filtered is List("b", "abc")
val filtered: Iterable[String] = filter(List("a", "b", "abc"), (s: String) => s contains "b")
//filtered is List(Some(1), Some(2))
val filtered: Iterable[Option[Int]] = filter(List(Some(1), Some(2), None), (op: Option[Int]) => op.isDefined)
//you can't call this because T is not the same everywhere it's used
val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined)
//this will get you
<console>:12: error: type mismatch;
found : Option[Int] => Boolean
required: Int => Boolean
val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined)
^