Higher-Order Functions

  • def 定义的是方法,而不是函数
  • 函数可作为变量存在,可直接调用,也可作为值传递给其他函数
  • _ 后缀将普通方法变为函数: ceil _
    • 根据上下文编译器可以自动将方法转换为函数,也可省略 _ 后缀
  • 高阶函数,接收函数的函数
  • 参数类型推导
    • 匿名函数传递给其他函数或方法时,如果一直到参数类型,则可省略匿名函数的参数类型,可自动推导类型
    • 参数只有一个时可省略括号
      • 当参数在右侧只出现一次时,可使用 _ 简写
  • 闭包 Closures,特定作用域
  • SAM, single abstract method interface
    • 对应 Java 中的函数式接口 (1.8)
    • 可将 Scala 函数传递给 Java,只在函数字面量中起作用
  • 柯里化 Currying
    • 将接收两个参数的函数变为接收第一个参数的函数,该函数返回一个消费第二个参数的函数
  • 控制抽象 Control Abstractions
    • Scala 只包含少量的流程控制语句,用户可自定义控制语句

Pattern Matching and Case Classes

  • 可对任何类型进行模式匹配,匹配顺序从上至下

  • 模式匹配代替 switch,默认分支为 case _;可避免 switch 语句中因缺少 break 带来的 fall-through 问题

  • 模式匹配也是表达式,可将其返回值直接赋值给变量

  • 模式守卫 / guards,为匹配设置条件,任何 Boolean 条件都可作为模式守卫;case ... if ... => ...

  • case 关键字后接变量名或对应数据结构中使用变量名,那么匹配项就赋值给该变量,变量名必须以小写字母开头

  • 使用 | 分隔同一匹配的多个可选项,此时不可使用变量绑定元素

  • 类型匹配,代替 isInstanceOfasInstanceOf,直接进行类型转换

    • 必须为类型指定变量名,否则匹配的是实际的类型对象
    • 匹配在运行时发生,而 JVM 泛型会被擦除
      • 不可以匹配具体的 Map 类型(可使用 case Map[_, _],不可使用 case Map[Int, Int]
      • Array 的类型不会被擦除
  • 解构 destructuring

    • 匹配数组
      case Array(x, y) => s"$x $y"  // 匹配长度为2的数组,并将分别绑定到 x, y
      case Array(0, rest @ _*) => rest.min // 可变参数
    • 匹配 List
      case x :: y :: Nil => ...  // 绑定参数
      case head :: tail => ... // 解构 head , tail
    • 匹配元组
      case (0, _) => ... // 匹配第一个元素为0
      case (x, y) => ... // 绑定参数
  • 定义变量,注意一定要小写开头;其实等价于 match 模式匹配加上赋值操作

    • val (x, y) = (1, 2)
    • val Array(f, s, rest @ _*) = arr
  • 用于 for 循环遍历集合,匹配符合条件的元素

    for ((k, v) <- System.getProperties()) println(s"$k $v")
    // 匹配 value 为 "" 的项,其他的则被忽略
    for ((k, "") <- System.getProperties()) println(k)
    // if guard 过滤
    for ((k, v) <- System.getProperties() if v == "") println(k)
  • Case Class

    • 用于模式匹配的特殊类
    • 构造参数默认为 val,默认提供 applyunapplytoStringequalshashCodecopy
      • copy 用于复制对象时,可使用命名参数来修改属性
    • case class X 使用时 case X() => ...,需要括号
    • case object S 单例,使用时 case S => ..., 不要括号
    • :: 也是 case class,配合中缀表达式,就是常见的匹配方式,case head :: tail,实际调用 ::(head, tail)
    • 可用于嵌套的结构;绑定变量、可变参数匹配类似
    • 适用于固定结构的类,如 List
  • sealed 密封的

    • 被修饰的类,则其子类必须和该类在同一个文件中定义
    • 在编译时即确定了所有匹配项的可能性
  • Option 也是使用 case class 来表示是否有值存在的

    • 子类 Some 封装值,子类 None 表示无值
    • 相比使用 ""null 更加安全
    • Map 进行 get 操作返回的也是 Option,也可使用模式匹配来处理
    • getOrElse 尝试获取值,未获取到则使用给定的值
  • Partial Function 偏函数

    • 没有对所有输入进行定义的函数
    • apply 从模式匹配中计算函数值,isDefinedAt 判断输入是否匹配定义的模式
    • case 语句块是偏函数
    • PartialFunction[A, B] 的实例, A 为输入类型,B 为输出类型
      • 可使用偏函数的 lift 方法,将偏函数变为常规函数,返回值为 Option[B]
      • 也可以通过 Function.unlift 将返回 Option[B] 的函数变为偏函数
    • Seq[A] 也是偏函数 PartialFunction[Int, A]
    • Map[K, V] 也是偏函数 PartialFunction[K, V]
    • catch 语句也是偏函数,可在 catch 块中使用模式匹配处理异常

注解

  • Scala 中注解可影响代码编译,如 @BeanProperty 会自动生成 getter/setter
  • 可用于 类、方法、字段、变量、参数等
    • 多个注解无顺序
    • 主构造器的注解,需要加括号 class Credential @Inject() (var username: String, var password: String)
    • 表达式的注解,使用分号加注解的方式 (map.get(key): @unchecked) ...
    • 类型参数的注解,class Test[@specialized T]
    • 实际类型的注解,放在类型之后,def name: String @Localized
  • 注解实现
    • 注解必须继承 Annotation
    • 类型注解必须继承 TypeAnnotation
    • 元注解 @param, @field, @getter, @setter, @beanGetter, @beanSetter
  • 对应 Java 修饰符、标记接口
    • @volatile 对应 volatile 关键字
    • @transient 对应 transient 关键字
    • @strictfp 对应 strictfp 关键字
    • @native 对应 native 关键字
    • @cloneable 对应 Cloneable
    • @remote 对应 java.rmi.Remote
    • @SerialVersionUID 代替序列化字段
  • 使用 @throws(classOf[Exception]) 来处理 Java 中的受检异常
  • @varargs 处理可变参数
    • @varargs def name(args: String*) 生成 void name(String... args)
    • 没有 @varargs 则可变参数会被转换成 Seq[T]
  • 优化
    • @tailrec 会尝试优化尾递归调用,将其变为循环
    • @switch 编译器会检查 match 表达式是否编译为 ableswitchlookupswitch,如果被编译成一系列条件表达式,则会抛出异常
    • @inline, @noinline 建议编译器是否将方法替换为行内调用
    • @elidable, 用于标注在生产代码中可移除的方法
      • elidable 对象定义了很多级别常量可直接使用,未指定参数时默认是 SERVERE 即 1000(包含1000)
    • @specialized 处理基础类型,自动生成基础类型对应包装类的方法

Scala Class etc. 2的更多相关文章

  1. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  2. scala练习题1 基础知识

    1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等:     2,在scala REPL中,计算3的平方根,然 ...

  3. 牛顿法求平方根 scala

    你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...

  4. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  5. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  6. Scala快速概览

    IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...

  7. Scala Macros - scalamela 1.x,inline-meta annotations

    在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...

  8. Scala Macros - 元编程 Metaprogramming with Def Macros

    Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...

  9. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  10. Scala For Java的一些参考

          变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...

随机推荐

  1. Web API接口安全了解

    2017版OWASP top 10 将API安全纳入其中,足以说明API被广泛使用且安全问题严重.自己尝试整理一下,但限于本人搬砖经验还不足.水平有限,本文只能算是抛砖引玉,希望大伙不吝赐教. 了解W ...

  2. linux安装包制作

    1. 常见安装包 打包或压缩文件tar,zip,gz等,一般解压后即可 管理工具的deb,rpm等.这类安装文件可以通过第三方的命令安装 (apt和yum) .bin类,其实就是把sh和zip打包为b ...

  3. kubernetes学习Service之headless和statefulSet结合

    一.首先说headless Service和普通Service的区别 headless不分配clusterIP headless service可以通过解析service的DNS,返回所有Pod的地址 ...

  4. MS Sql 优化步骤及优化not in一例

    今天接到客户投诉说系统卡死了,经过一翻努力,终于解决了.现将解决步骤记录一下,以便下次参考: 因为客户系统集中在阿里云上面,使用的是ms sql2008数据库,上面有N个客户,一下子无法知道是哪个客户 ...

  5. Designing Data-Intensive Applications笔记

    <Designing Data-Intensive Applications>书看完很久了,前段时间陈皓来公司技术分享也推荐了这本书.读起来酣畅淋漓,写篇系统总结的意愿强烈,无耐内容属实太 ...

  6. Linux的网络参数设置

    前面讲解了lLinux 的IP组成,下面就讲一下Linux的网络设置和数据传递. 其实这地方对运维的人员来说,不会要精通,但还是要了解.必要时刻还会用到的 电脑之间数据的传递: 数据的传递要分为下面几 ...

  7. Jupyter 中的 10 个魔法函数

    1)%pwd 于显示Jupyter当前的工作空间. 2)%hist 显示当前Jupyter中,所有运行过的历史代码. 3)%who 显示当前Jupyter环境中的所有变量或名称. 4)%reset 删 ...

  8. dapi 基于Django的轻量级测试平台三 接口关联

    QQ群: GitHub:https://github.com/yjlch1016/dapi 一.接口关联思路: 在接口测试中, 很多场景下, 上一个接口的出参要作为下一个接口的入参, 即上一个接口的响 ...

  9. HFS ~ Http File Server

    HFS ~ Http File Server官网:https://www.rejetto.com/hfs/ 官方下载地址:https://www.rejetto.com/hfs/hfs.exe

  10. mysql 单表,多表,符合条件,子查询

    单表: HAVING过滤 二次筛选 只能是group by 之后的字段 1.查询各岗位内包含的员工个数小于2的岗位名.岗位内包含员工名字.个数 select post,group_concat(nam ...