map()
не принимает частичную функцию в качестве переданного параметра, но collect()
делает.
Seq(1, "a", 2, "b") collect {
case i: Int => i+1
}
//res0: Seq[Int] = List(2, 3)
Обратите внимание, что ввод, который не определен для частичной функции, не передается, а простоотброшен.То, что вы не хотите, чтобы ушел, нуждается в обработчике, даже если это просто обработчик case _ =>
по умолчанию.
Seq(1, "a", 2, "b", 'z') collect {
case i: Int => i+1 //increment ints
case c: Char => c.toUpper //capitalize chars
case s: String => s //strings pass through
}
//res0: Seq[Any] = List(2, a, 3, b, Z)
Когда вы передаете частичную функцию в map()
, компилятор не жалуется, потому что trait PartialFunction[-A, +B] extends (A) => B
,Другими словами, частичная функция является типом функции.
Стоит также отметить, что при работе с частичными функциями ...
ответственность вызывающего абонента за вызов isDefinedAt
перед вызовом apply
...
Таким образом, мы можем заключить, что collect()
делает это, а map()
нет.