【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中的函数式编程 ...
随机推荐
- 当 EDA 遇到 Serverless,亚马逊云科技出招了
近二三十年来,软件开发领域毫无疑问是发展最为迅速的行业之一. 在上个世纪九十年代,世界上市值最高的公司大多是资源类或者重工业类的公司,例如埃克森美孚或者通用汽车,而现在市值最高的公司中,纯粹的软件公司 ...
- 给 SSH 启用二次身份验证
转载自:https://mp.weixin.qq.com/s/ssuhFbfaHxxzGmLg6Y2MjA 目前来说,二次验证(这里就不做过多解释了)是比较常用的安全手段,通过设置二次验证(谷歌或其他 ...
- acwing349 黑暗城堡 (最短路径生成树)
求出最短树,用乘法原理统计答案就行了(模拟prim过程). 不知道说什么了,直接上代码: 1 #include<cstring> 2 #include<iostream> 3 ...
- Goland Socket 服务
客户端发送消息 并接收服务端消息 package main import ( "fmt" "net" ) func main() { // conn, err ...
- KTV和泛型(3)
泛型除了KTV,还有一个让人比较疑惑的玩意,而且它就是用来表达疑惑的:? 虽然通过泛型已经达到我们想要的效果了,例如: List<String> list = new ArrayList& ...
- Condition介绍
Condition Condition是一种多线程通信工具,表示多线程下参与数据竞争的线程的一种状态,主要负责多线程环境下对线程的挂起和唤醒工作. 方法 // ========== 阻塞 ====== ...
- 齐博x1更新了 提供一个部分用户期待已久的功能,修改主题后变为待审
如下图所示,你可以设置哪些用户组修改主题后,就会把原来已审核通过的主题,变为未审核.适合所有频道.
- 动词时态=>4.将来时态和过去将来时态构成详解
将来时态构成详解 使用助动词will构成的将来时态 一般将来时态 与一般过去时态相反(时间上) 如果说 一般过去,我们将其当做一张照片 从这张照片当中,我们无法得知 动作什么时候开始 什么时候结束 只 ...
- 故事 --- Linux和UNIX之间的那些爱恨与情仇
Linux和UNIX具体有哪些关系及区别? UNIX 与 Linux 之间的关系是一个很有意思的话题.在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 ...
- nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)
摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...