首页 > 其他分享 >Scala学习之旅-魔幻的PartialFunction

Scala学习之旅-魔幻的PartialFunction

时间:2024-09-16 09:56:04浏览次数:3  
标签:map 魔幻 val Scala Int private PartialFunction intValue

聊点什么

今天我们来聊聊Scala中的PartialFunction, 以及 collect 与 PartialFunction的完美结合

PartialFunction的定义

  • 只接受一个参数
  • 只处理输入数据中的一部分
  • 可以定义一个 isDefinedAt方法, 来定义可以处理的输入数据中的哪一部分, 和 apply方法

一个PartialFunction的小例子:过滤掉 None 和 odd 值, 只对 even 值求平方

  private val squareSomeEvenValue: PartialFunction[Option[Int], Double] = new PartialFunction[Option[Int], Double] {
    def apply(x: Option[Int]): Double = Math.sqrt(x.get)

    def isDefinedAt(x: Option[Int]): Boolean = x.isDefined && x.get % 2 == 0
  }
  private val squareSomeEvenValue2: PartialFunction[Option[Int], Int] = {
    case Some(intValue) if intValue % 2 == 0 => intValue * intValue
  }

下面我们看看PartialFunction在实战中的表现

collect完美结合PartialFunction

我们定义如下一个集合 sampleSeq, 包括 偶数(odd), 奇数(even)和None值,我们想从中挑出偶数并求其平方

  private val sampleSeq = Seq(
    Some(1),
    Some(2),
    None,
    Some(3),
    Some(4)
  )

传统写法当然比较直接, filter + filter + map或者 flatten + filter + map

  // 传统写法1: filter + filer + map
  private val filterMapSeq = sampleSeq
    .filter(_.isDefined)
    .filter(intValue => intValue.get % 2 == 0)
    .map(squareSomeEvenValue)

  // 传统写法2: flatten + filer + map
  private val flattenMapSeq = sampleSeq
    .flatten
    .filter(intValue => intValue % 2 == 0)
    .map(evenValue => evenValue * evenValue)

  // map 是不支持 PartialFunction的.
  Try(
    sampleSeq.map(squareSomeEvenValue)
  ) match {
    case Failure(exception) => println(exception)
  } // scala.MatchError: None (of class scala.None$)

此法当然够用直接明了但不优雅, 看看下面的collect + PartialFunction 组合

  // collect 支持 PartialFunction.
  private val collectSeq = sampleSeq.collect(squareSomeEvenValue)

确实优雅!

言而总之

scala的PartialFunction给到大家一块甜甜的语法糖,追求代码极致优雅简洁的朋友可以一试。当然本文只是个引子,简单聊了其基本用法。
大家可以再试试orElse and andThen, 可以解锁更多玩法。

完整示例代码

package ddu.scala.articles

import scala.util.{Failure, Try}

object TalkAboutPartialFunction extends App {

  private val sampleSeq = Seq(
    Some(1),
    Some(2),
    None,
    Some(3),
    Some(4)
  )

  /**
   * 过滤掉Seq中的None和 odd 值, 只对 even 值求平方.
   * 下面是 PartialFunction 的两种写法, 当然在scala中最常用的是第二种case statement.
   *
   */
  private val squareSomeEvenValue: PartialFunction[Option[Int], Double] = new PartialFunction[Option[Int], Double] {
    def apply(x: Option[Int]): Double = Math.sqrt(x.get)

    def isDefinedAt(x: Option[Int]): Boolean = x.isDefined && x.get % 2 == 0
  }
  private val squareSomeEvenValue2: PartialFunction[Option[Int], Int] = {
    case Some(intValue) if intValue % 2 == 0 => intValue * intValue
  }

  // 传统写法1: filter + filer + map
  private val filterMapSeq = sampleSeq
    .filter(_.isDefined)
    .filter(intValue => intValue.get % 2 == 0)
    .map(squareSomeEvenValue)

  // 传统写法2: flatten + filer + map
  private val flattenMapSeq = sampleSeq
    .flatten
    .filter(intValue => intValue % 2 == 0)
    .map(evenValue => evenValue * evenValue)

  // map 是不支持 PartialFunction的.
  Try(
    sampleSeq.map(squareSomeEvenValue)
  ) match {
    case Failure(exception) => println(exception)
  } // scala.MatchError: None (of class scala.None$)


  // collect + PartialFunction
  private val collectSeq = sampleSeq.collect(squareSomeEvenValue)

  assert(collectSeq == filterMapSeq)
  assert(collectSeq == flattenMapSeq)
}

标签:map,魔幻,val,Scala,Int,private,PartialFunction,intValue
From: https://blog.csdn.net/robbywt/article/details/142298557

相关文章

  • Scala学习之旅-对Option友好的flatMap
    聊点什么OptionflatMapvs.OptionOption的作用在Java/Scala中,Optional/Option(本文还是以scala代码为例)是用来表示某个对象存在或者不存在,也就是说,Option是某个类型T的Wrapper,如果T!=null,Option(T).isDefined==true如果T==null,Option(T).isE......
  • Scala学习之旅-Class Constructor
    在生活和学习中,懂得拿捏对象是非常重要的!本篇我们用Scala和Java来定义一个类,一起来看看Scala在搞定对象方面有啥厉害的地方。ScalaclassclassPerson(valname:String,varage:Int){overridedeftoString:String={s"$name'sageis$age"}defappl......
  • 【Scala入门学习】Scala的方法和函数
    1.方法在scala中的操作符都被当成方法存在,比如说+、-、*、/1+2就是1.+(2)的调用,2.0是doule类型,强调用Int类型的写法为1.+(2:Int)1.1方法的声明和使用定义方法的语法:def方法名([变量:变量类型,变量:变量类型]):返回值类型={方法体}其中:在scala中,方法里面的最后一个表......
  • 【Scala入门学习】基本数据类型和变量声明
    1.基本数据类型scala的基本类型有9种:Byte、Char、Short、Int、Long、Float、Double、Boolean、UnitScala中没有基本数据类型的概念,所有的类型都是对象。AnyVal:代表所有基本类型。AnyRef:代表所以引用类型,包括Scalaclass和Javaclass。Any:是所有类的超类。如果不知......
  • scala语言是什么?
    Scala是一种基于Java虚拟机(JVM)的编程语言。 它融合了面向对象编程和函数式编程的特点。在面向对象方面,它有着完善的类、对象等概念体系;在函数式编程方面,函数可以像数据一样被传递和操作。 Scala具有以下特点: 代码简洁性方面 -支持类型推断,减少了代码中类型声明的......
  • Scala
    浮点数精度问题的解决 Scala的if语句   Scala的IDEA环境搭建   ......
  • Scala的数据类型与运算的应用
    在Scala中,数据类型和运算的应用非常广泛,它们是构建程序的基础。以下是关于这些内容的详细介绍: 基本数据类型:Scala提供了八种基本数据类型,包括Byte、Char、Short、Int、Long、Float、Double和Boolean。这些类型涵盖了数值、字符、布尔值等不同的数据类型。例如,使用vali=1......
  • 在IDEA中安装Scala插件
    先打开IDEA[文件]右键,[设置] 点击[插件],输入Scala并搜索,点击[安装]安装完成后点击[重启IDE]  重启后,[文件]右键,[新建],[项目] 点击[创建]点击[此窗口]或[新窗口]  [文件]右键,点击[项目结构]点击[全局库],点击[+]号  选择[ScalaSDK] 选择第一个,点击[......
  • Scala在IDE中如何配置运行
    一、新建项目二、添加项目结构三、创建Scala类创建一个Object类,编写一个简易程序如下......
  • Scala的基本运算
    Scala是一种多范式的编程语言,它支持多种类型的运算,包括算术运算、关系运算、逻辑运算、位运算以及赋值运算。以下是这些基本运算的简要概述: 算术运算:基本的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。这些运算符可以对数值类型进行操作。例如,3+2结果为5,3-2......