【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型
重点版
详细版
基础知识常量和变量尽量使用常量val别使用变量var变量的命名数字字母下划线_特殊的用法数据类型java基本数据类型引用数据类型scalaAny-对象的根类AnyVal-数值类型LongInt...StringOps使用String的时候, 有些情况会通过隐式转换☆的形式到这个类型Unit类似java的voidAnyRef-引用类型Java中所有的类, 到scala中都属于AnyRefscala的所有集合定义的所有的类Null只有一个nullNothing任意类型的的子类如果抛异常, 则返回类型是Nothing没有对象, 也没有子类. 数据之间的转化值类型的转换.toInt.toLong...AnyRef类型的转换判断:.isInstanceof[...]强制类型转换:.asInstanceof[...]流程控制顺序选择if else if else※val max = if(m >n) m else n模式匹配:根据不同的case选择循环whiledo ...while很少使用for(i <- 1 until n + 1)常用在集合:本质上是一种遍历或迭代去遍历一个序列(集合, 字符串...)守卫(条件判断式)for(i <- 1 to 3 if i != 2) 嵌套...for推导val nums = for(i <- 1 to 100) yield i * i集合中:val nums = (1 to 100).map(x => x * x) 使用map算子替换上面【函数式编程】循环的退出抛异常自己抛, 自己捉. try catchscala'提供的模板Breaks.xxx完成breakbreakable {xxx}把循环放在函数内, 使用return结束函数, 从而结束循环运算符在scala中没有真正的运算符, 所有的运算符都是方法名1 + 2 ==== 1.+(2)结合性左结合数学运算符右结合: 结尾::--list添加元素:::--两个list做并集/:左折叠+:赋值号a = 3 + 4
函数式编程☆基本概念函数是一等公民(做参数、做返回值)纯函数是追求的目标,好处是天然的高并发、安全,不会出现共享变量没有副作用对外界不产生影响引用透明返回值只依赖参数, 不依赖任何的外部数据过程只有副作用, 没有返回值如:main函数,def main(args: Array[String]): Unit = {xxx}基本用法定义def sum(a:Int, b:Int)参数参数都是val常量☆参数的默认值有默认值的放在后面age : Int = 30命名参数def test4( sex : String = "男", name : String ): Unittest4(name="ximenqing")返回值返回值可以省略, scala会自动推导内部不能有return返回Unit高阶函数概念参数接受一个或多个函数, 或者返回值是函数如何传递给高阶函数传递函数匿名函数( ) => 函数实现( a: Int, b:Int ) => a + b传给高阶函数的时候参数类型可以省略( a, b) => a + b简化原则【至简】用下划线进行化简参数只用一次, 可以用_ 简写arr.reduce( _ + _)闭包匿名函数和他的环境【访问外部变量的环境时】延长局部变量的声明周期def foo(): () => Int{val a = 10( ) => a + 20【闭包】,并且匿名函数作为返回值 }
val f = foo( )f( )---表示内部的匿名函数柯里化☆理论基础是闭包把一个参数列表变成多个参数列表部分应用函数val f = math.pow(_, 2)省略的时候, 有些时候不能省略, 可以用部分应用函数来解释Array(1,2,3).map(x => x)Array(1,2,3).map(_)Array(1,2,3).map(+_)def foo( 必传的参数)( 隐式参数 ),需要调用两次!抽象控制名调用和值调用名调用控制抽象的理论基础f( 3 + 4)3 + 4这个表达式传递过去, 没有先计算def f( op: => Unit )f {// 代码
}值调用f (3 + 4)等价于f(7)def f(op: ( ) => Unit)f( () => {//代码})
面向对象思想和java一样类的定义构造函数主构造位置和类名在一块class User(val age: Int, var name: String, sex: String){ // 代码 println("主构造") // 辅构造 def this(){ // 首行必须是主构造 this(10, "b", "F")☆☆☆ } // a是一个只能在当前的构造函数内用的普通的常量 def this(a: Int){ this() println(a) } def foo()= { println(sex) // 更加函数式 println(this.sex) // 更加面向对象 }}辅助构造主构造内部包括的是辅助构造访问权限默认都是公共包导包及其灵活创建package,导入import封装属性的封装自己格式的getter和setter@BeanProperty可以添加java格式的标准bean伴生对象和伴生类object和class的名字相等特点1. 他们必须在同一文件中2. 可以互相访问对方的私有成员apply任何对象都可以像调用函数一样去调用对象!!!package com.atguigu.scala1015
/** * Author atguigu * Date 2020/4/10 10:35 */object ApplyDemo { def main(args: Array[String]): Unit = { val a = new A a.foo() a(10) // 等价于 a.apply(10) A() // A.apply() }}object A{ // 一般是返回伴生类的对象. 好处就是创建伴生类对象的时候, 可以省略new // 样例类就是这么玩 def apply() = { println("A apply...") }}
class A{ def foo(): Unit ={ println("foo...") } def apply(n:Int) = { println(n) }}
继承extendsoverride 重写方法的重写两同方法名参数列表两小返回值类型抛出的异常类型一大访问权限属性的重写val可以重写val和没有参数的defvar只能重写抽象的var抽象类abatract修饰抽象函数只有函数的签名, 没有函数体抽象字段只有声明, 没有初始化trait采用特质/特征代替接口的概念extends 父类 with 特质1 with 特质2=抽象类+接口动态混入:创建对象时混入,而无需使类混入特质叠加:解决多个混入的特质包含的相同方法,如"blue-" + super.describe()样例类apply构造和unapply返回用来完全的去替换掉了java的bean配合模式匹配, 功能很强
集合☆☆整体架构不可变集合immutableSeqList空List[Int]( )Nil:: 在头部添加元素:::在头部合并集合Array--IndexSeq转换arr1.toBuffer/toArraySet空Set[Int]( )交集并集差集Map空Map[String, String]( )val value = map(key)key不存在会抛异常val opt: Option[Int] = map.get(key)有值some,无值nonemap.getOrElse(30, 100)元组val tuple: (Int, String, Boolean) = (40,"bobo",true)tuple._2/tuple.productElement(0)/迭代器可变集合mutable类似Java的StringBuilder,不会返回新对象ArrayBufferval arr01 = ArrayBuffer[Any](1, 2, 3)ListBufferCRUD方法mutable.Setmutable.Mapval map = mutable.Map( "a"->1, "b"->2, "c"->3 )TreeSetSet集合, 他兄弟HashSet可以给存入他的元素进行自动排序TreeMap按照map的key来进行操作通用的方法或函数简单 println(list1.head) // 拿出来第一个 println(list1.last) // 拿出来最后一个 println(list1.tail) // 干掉第一个 println(list1.init) // 干掉最后一个 println(list1.take(2)) // 取出来前3个 println(list1.drop(2)) println(list1.takeRight(2)) println(list1.dropRight(2))复杂高级算子foreachmapflatMapreducefoldLeftscanLeftzipzipzipAllzipWithIndex排序sortedsortWithsortBy(x => x.abs)掌握偏函数applyOrElse根据输入参数返回不同结果wordCount手写Option特殊类型Option(选项):有值(Some),无值(None)Either
隐式转换隐式转换函数用于扩展某个类的功能implicit def ...隐式转换函数, 只看参数的类型和返回值类型, 不管函数名隐式值类是对隐式转换函数的升级版, 或者是个语法糖隐式参数和隐式值柯里化的时候, 这块几乎用的比较多语法糖的: 泛型上下文查找的路径当前作用域相关类型的伴生对象中
模式匹配(替换if else)x match {case => xxx}类型匹配集合的内容匹配对象匹配对样例类进行匹配样例类:object 的apply和unapply方法偏函数
泛型能够看懂别人的泛型代码泛型的3变不变[A]协变[+A]子类逆变[-A]父类只会用简单泛型泛型类泛型方法泛型的上界泛型的上下文界定
【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型的更多相关文章
- Scala入门系列(十二):隐式转换
引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
- Scala入门到精通——第十九节 隐式转换与隐式參数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...
- Scala的函数,高阶函数,隐式转换
1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...
- Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution
在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typ ...
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- 12、scala隐式转换与隐式参数
一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...
- 【Scala】什么是隐式转换?它又能用来干嘛?该怎么用
文章目录 定义 隐式参数 隐式转换 隐式值:给方法提供参数 隐式视图 将Int和Double类型转换为String 狗狗学技能(使用别的类中的方法) 使用规则 定义 隐式参数 隐式参数指在函数或者方法 ...
- scala的隐式转换学习总结(详细)
一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- Python基础:函数式编程
一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...
随机推荐
- MySQL一致性读原来是有条件的
众所周知,在设定了隔离等级为Repeatable Read及以上时,InnoDB 可以实现数据的一致性读.换句话来说,就是事务执行的任意时刻,读取到的数据是同一个快照,不会受到其他事务的更新影响. 以 ...
- CentOS 7.x 升级OpenSSH
升级SSH 存在中断风险,如果SSH 升级失败将会导致终端无法登录,建议在使用本地虚拟机进行测试后对线上生产环境进行升级操作!!! 三级等保评测中对主机进行漏洞扫描发现linux主机存在高危漏洞,查看 ...
- nginx配置文件安全设置--重要
防止Nginx头部攻击漏洞和恶意域名解析漏洞 在nginx主配置文件中,写第一个server,server_name用默认default_server,让所有未匹配的server_name,都走这个s ...
- 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)
前言 今天我们一起来使用LabVIEW AI视觉工具包快速实现图像的滤波与增强:图像灰度处理:阈值处理与设定:二值化处理:边缘提取与特征提取等基本操作.工具包的安装与下载方法可见之前的博客. 一.图像 ...
- P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)
P2680 题目的大意就是走完m条路径所需要的最短时间(边权是时间), 其中我们可以把一条边的权值变成0(也就是题目所说的虫洞). 可以考虑二分答案x,找到一条边,使得所有大于x的路径都经过这条边(差 ...
- PHP + ELK实现日志记录
一个简单的PHP 文件 效果 full.conf文件 流程: 开启logstash服务之后. 在业务代码里面操作函数写入日志.log logstash通过实践戳获取到用户的变更,取出最后一行数据,发送 ...
- 15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)
1.报错的代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- Teambition企业内部应用开发指南
Teambition企业内部应用Python开发指南 注意:此文章并非搬运,一小部分仅为借鉴. Teambition提供了API接口,我们可以注册成为开发者,然后通过接口获取Teambition的数据 ...
- Chrony时间同步服务
概: 网络时间协议(Network Time Protocol,NTP)是用于网络时间同步的协议.提供NTP时间同步服务的软件有很多,这里采用Chrony软件来实现时间同步 chrony 的优势: ...
- Eureka Server 实现在线扩容
Eureka Server 实现在线扩容 作者:Grey 原文地址: 博客园:Eureka Server 实现在线扩容 CSDN:Eureka Server 实现在线扩容 需求 Eureka 是 Sp ...