大数据技术之_16_Scala学习_09_函数式编程-高级

第十三章 函数式编程-高级

13.1 偏函数(partial function)

13.1.1 提出一个需求,引出思考

给你一个集合 val list = List(1, 2, 3, 4, “abc”),请完成如下要求:
1、将集合 list 中的所有数字 +1,并返回一个新的集合。
2、要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)。

13.1.2 解决方式-filter + map 返回新的集合
13.1.3 解决方式-模式匹配

两种方式的示例代码如下:
示例代码如下:

package com.atguigu.chapter13

/**
  * 给你一个集合 val list = List(1, 2, 3, 4, "abc"),请完成如下要求:
  * 1、将集合 list 中的所有数字 +1,并返回一个新的集合。
  * 2、要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)。
  */
object PartialFunDemo01 {
   
  def main(args: Array[String]): Unit = {
   
    // 思路1:filter + map 方式解决
    // 虽然可以解决问题,但是麻烦。
    val list = List(1, 2, 3, 4, "abc")
    // 先过滤,再map
    list.filter(f1)
    println(list.filter(f1).map(f2).map(f3)) // List(2, 3, 4, 5)

    // 思路2:模式匹配
    // 小结:虽然使用模式匹配比较简单,但是不够完美。
    val list2 = list.map(addOne2)
    println(list2) // List(2, 3, 4, 5, ())
  }

  // 模式匹配
  def addOne2(i: Any): Any = {
   
    i match {
   
      case x:Int => x + 1
      case _ =>
    }
  }

  // 将 List 转为 Any
  def f1(n: Any): Boolean = {
   
    n.isInstanceOf[Int]
  }

  // 将 Any 转为 Int [map]
  def f2(n: Any): Int = {
   
    n.asInstanceOf[Int]
  }

  def f3(n: Int): Int = {
   
    n + 1
  }
}

输出结果如下:

List(2, 3, 4, 5)
List(2, 3, 4, 5, ())
13.1.4 偏函数的基本介绍

13.1.5 偏函数的快速入门

示例代码如下:

package com.atguigu.chapter13

object PartialFunDemo02 {
   
  def main(args: Array[String]): Unit = {
   
    // 使用偏函数解决
    val list = List(1, 2, 3, 4, "hello")
    // 定义一个偏函数
    // 1. PartialFunction[Any, Int] 表示偏函数接收的参数类型是 Any,返回的类型是 Int
    // 2. isDefinedAt(x: Any) 如果返回 true,就会去调用 apply 构建对象实例,如果是 false,就过滤
    // 3. apply 构造器,对传入的值 + 1,并返回(新的集合)
    val addOne3 = new PartialFunction[Any, Int] {
   
      def isDefinedAt(any: Any) = if (any.isInstanceOf[Int]) true else false
      def apply(any: Any) = any.asInstanceOf[Int] + 1 // 将 any 显示转换成 Int
    }

    // 使用偏函数
    // 说明:如果是使用偏函数,则不能使用 map,应该使用 collect
    // 说明偏函数的执行流程
    // 1. 遍历 list 集合的所有元素
    // 2. 然后调用 val element = if(partialFun-isDefinedAt(list单个元素)) {partialFun-apply(list单个元素)}
    // 3. 每得到一个符合要求的元素 element,放入到新的集合,最后返回
    val list3 = list.collect(addOne3)
    println(list3) // List(2, 3, 4, 5)
  }
}

输出结果如下:

List(2, 3, 4, 5)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值