偏函数: 应用到序列的每一个元素上, 最后返回一个新的序列 - 偏函数做了 filter 和 map 要做的事情。
案例一:过滤一个数组内 小于25并大于3 的姓名;
定义数组 val wordFrequencies = ("habitual", 6) :: ("and", 56) :: ("consuetudinary", 2) ::
("additionally", 27) :: ("homely", 5) :: ("society", 13)
java8的 函数式写法 (内置了一个对象)
list.stream().filter(o->o.getSize()<25 && o.getSize()>3).map(A::getName).collect(Collectors.toList());
scalac 写法一:
wordFrequencies.filter(wf => wf._2 > 3 && wf._2 < 25).map(_._1)
写法上和java8几乎一致(不一样的地方在创建数组上以及scala用了通配符匹配元素)
优化写法一:模式匹配形式的匿名函数(比上面参数构造看着清晰了一些)
wordFrequencies.filter { case (_, f) => f > 3 && f < 25 } map { case (w, _) => w }
偏函数写法
val pf: PartialFunction[(String, Int), String] = {
case (word, freq) if freq > 3 && freq < 25 => word
}
wordFrequencies.collect(pf) // List("habitual", "homely", "society")
关键的写法是 collecet的定义,A,B分别是list对象里的key,value
def collect[B](pf: PartialFunction[A, B]): Seq[B]