1、如何设计一个编程语言
找到这些编程语言共同点和不同点。
2、为什么学习scala
3、环境安装
4、入门程序
5、变量的定义
6、数据的类型
7、操作运算符和编程规范
8、流程控制
9、函数和方法
定义、使用、关系(相互转换)
10、scala数组
11、scala集合
——————————
Scala 官网:https://www.scala-lang.org/
集成面向对象编程和函数式编程的各种特性。Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的 Java 程序。
面向对象编程、面向过程编程以及函数式编程3者的区别是什么?
编程语言的分类方式有哪些?
1、 面向对象和函数式编程
2、 静态编程语言和动态编程语言
3、 编译型和解释型
4、 汇编语言,脚本语言,机器语言,高级语言
5、 强类型语言和弱类型语言
Python 是动态类型语言,是强类型语言。
JavaScript 是动态类型语言,是弱类型语言。
Java 是静态类型语言,是强类型语言。
Scala 将成为未来大数据处理的主流语言。
如何安装Scala?
https://blog.csdn.net/qq_1018944104/article/details/85054596
关于Scala数据类型
1、一个要点:名称和java相同的类型,长度也一样,不过都是首字母大写。
2、一张图:表明整个Scala编程语言的数据类型的关系
3、七个知识点
- Any 是所有类的父类,包括值类型 AnyVal,和引用类型 AnyRef
- AnyVal 是所有值类型的父类,包括 Int,Double,Boolean,Unit 等等
- AnyRef 是所有引用类型的父类,包括 Null
- Null 是所有引用类型的子类
- Nothing 是所有类的子类
- Unit 类型只有一个实例,是(),相当于 java 中的 void,没有任何的实质意义
- Null 也只有一个实例,是 null,相当于 java 中的 null,能赋值给任何引用类型变量,不能赋值给值类型变量
ne eq equals == 的区别
简言之,equals方法是检查值是否相等,而eq方法检查的是引用是否相等。所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。
条件表达式 if
总结:
1)if 条件表达式它是有返回值的,返回值是多个分支的返回结果的共同父类
2)返回值会根据条件表达式的情况会进行自动的数据类型的推断(返回的是多个分支的共同父类)
总结:就算是赋值表达式,也是有返回值的。是空,是 Unit
循环 for 和 while
在 scala 中有 for 循环和 while 循环,用 for 循环比较多。for 循环语法结构:for (i <- 表达式/数组/集合)
总结:
1)while 使用跟 java 一模一样
2)注意点:在 scala 里面不支持 i++ i-- 等操作统一写成 i+=1 i-=1
方法和函数
Scala 中的+ - * / %等操作符的作用与 Java 一样,位操作符 & | ^ >> <<也一样。
只是有一点特别的:这些操作符实际上是方法。例如:
a + b
是如下方法调用的简写:
a.+(b)
a 方法 b 可以写成 a.方法(b)
定义方法
scala> def ml(x:Int,y:Int):Int = x*y
ml: (x: Int, y: Int)Int
scala> def m2(x:Int,y:Int){println("aa");var aa = 2;aa}
m2: (x: Int, y: Int)Unit
scala> m2(1,2)
aa
scala> def m3(x:Int,y:Int) = {println("aa");var aa = 2;aa}
m3: (x: Int, y: Int)Int
scala> m3(1,2)
aa
res4: Int = 2
方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型
注意:函数体应该改成叫方法体!!!如果不写等号,代表没有返回值。
定义函数
scala> val add = (x:Int,y:Int) => x + y
add: (Int, Int) => Int = <function2>
scala> add(1,2)
res5: Int = 3
函数意义:表示接受两个 Int 类型的变量,然后做累加。经过 scala 的自动类型推断得知,最后返回的结果数据的类型也是 Int。
方法与函数的区别
1、函数可以作为方法的参数,但是也可以作为函数的参数
scala> def m2(f:(Int,Int)=>Int) = f(2,6)
m2: (f: (Int, Int) => Int)Int
scala> val f2 = (x:Int,y:Int) => x -y
f2: (Int, Int) => Int = <function2>
scala> m2(f2)
res6: Int = -4
scala> val aa = (x:Int) => x + 1
aa: Int => Int = <function1>
scala> val bb = (f:Int => Int,x:Int) => f(x) + 1
bb: (Int => Int, Int) => Int = <function2>
scala> bb(aa,5)
res7: Int = 7
2、方法也可以作为方法的参数,也可以作为函数的参数
scala> def mm(x:Int,y:Int):Int = x + y
mm: (x: Int, y: Int)Int
scala> def mm1(f:(Int,Int) => Int,x:Int,y:Int) = f(x,y)
mm1: (f: (Int, Int) => Int, x: Int, y: Int)Int
scala> mm1(mm,2,4)
res8: Int = 6
scala> mm1(mm _,2,4)
res9: Int = 6
scala> def m1(x:Int,y:Int) = x + y
m1: (x: Int, y: Int)Int
scala> val f2 = (f:(Int,Int) => Int,z:Int,b:Int) => f(z,b)
f2: ((Int, Int) => Int, Int, Int) => Int = <function3>
scala> f2(m1,2,3)
res10: Int = 5
scala> f2(m1 _,2,3)
res11: Int = 5
注意:_ 可以将方法和函数进行相互转换
Scala 函数式编程特点
高阶函数(Higher-order functions)
闭包(closures)
模式匹配(Pattern matching)
单一赋值(Single assignment)
延迟计算(Lazy evaluation)
类型推导(Type inference)
尾部调用优化(Tail call optimization)
类型推导(Type inference)
Scala 数组 Array
两对概念:
1、定长 和 变长(长度是否可以改变) 数组
关于数组:有定长,和 不定长/变长 的区分
定长数组: Array
变长数组: ArrayBuffer
2、可变 和 不可变 ------> 集合 List Set Map Tuple Seq
可变:mutable
不可变:immutable
不可变的集合 就跟 val修饰的普通值变量一样
数组的知识点包括:定义、访问、遍历、修改、删除、拼接