Scala Class etc. 2
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关键字后接变量名或对应数据结构中使用变量名,那么匹配项就赋值给该变量,变量名必须以小写字母开头使用
|分隔同一匹配的多个可选项,此时不可使用变量绑定元素类型匹配,代替
isInstanceOf和asInstanceOf,直接进行类型转换- 必须为类型指定变量名,否则匹配的是实际的类型对象
- 匹配在运行时发生,而 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 // 可变参数
- 匹配
Listcase 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,默认提供apply、unapply、toString、equals、hashCode、copycopy用于复制对象时,可使用命名参数来修改属性
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表达式是否编译为ableswitch或lookupswitch,如果被编译成一系列条件表达式,则会抛出异常@inline,@noinline建议编译器是否将方法替换为行内调用@elidable, 用于标注在生产代码中可移除的方法elidable对象定义了很多级别常量可直接使用,未指定参数时默认是SERVERE即 1000(包含1000)
@specialized处理基础类型,自动生成基础类型对应包装类的方法
Scala Class etc. 2的更多相关文章
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
- Scala For Java的一些参考
变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...
随机推荐
- vue开发相关问题以及解决方案
1.使用ref获取到dom元素,但是无法获取到dom元素的样式? 给div盒子加上<div ref="remove">, 在控制台打印为undefined. 此时我们打 ...
- json方式的面向对象、拖拽
//json方式的面向对象 var obj= { a:, b:, c:function(){ alert( } } obj.c();//12 //命名空间 var miaov={}; miaov.co ...
- element表格的滚动条在合计上边
默认滚动条是在下边的,不好看,这里改一下 修改样式.完美解决: .el-table { overflow-x: auto; } .el-table__header-wrapper, .el-table ...
- 25. Apache Shiro Java反序列化漏洞
前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...
- MyDAL - .OpenDebug() 与 Visual Studio 输出窗口 使用
索引: 目录索引 SQL Debug 信息说明 一. 对 XConnection 对象 未开启 OpenDebug, 在 VS 状态下,将默认在 VS 窗口 打印出 参数化的 SQL 执行语句: 新 ...
- python基本数据类型的时间复杂度
1.list 内部实现是数组 2.dict 内部实现是hash函数+哈希桶.一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突. 3.set 内部实 ...
- 【转】Pandas学习笔记(四)处理丢失值
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 《always run团队》第六次作业:团队项目系统设计改进与详细设计
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 作业链接地址 团队名称 always run 作业学习目标 掌握面向对象软件设计方法:(2)完善系统设计说明书,掌握面向对象详细设计内 ...
- 【Linux】Windows终端远程链接Linux服务器
一.Windows cmd ssh链接 1.控制面板->程序->启用Telnet客户端 2.输入命令链接 cmd中输入 ssh 账号名@服务器ip地址:端口号 例如: ssh root@1 ...
- 产品上线后,出现BUG的处理流程
根据bug的大小,如果影响业务逻辑及用户提醒及时处理,如果只是一些状态.文案等等对业务无重大影响可以跟版本迭代走 很严重的bug必然要回滚,想都不要想赶紧去着手安排做. 检查回滚版本是否会丢失数据,如 ...