1-scala基础
1、scala
①定义:Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
②特点:优雅、简洁、一行代码抵得上多行Java代码
2、变量和常量、懒值
- var r = 1
- r = 2;
- r = 'A' //这是有问题的,var定义的r是int
- var rStr: String = "1" //可以在定义的时候指定类型
- var a,b = 1 //定义多个变量
- val c = 2 //常量
注 :val就不能再赋值了。与之对应的,var可以在它生命周期中被多次赋值
注:官方推荐val 使用val的好处:
1、更安全 2、代码可读性更高 3、资源回收更快,方法执行完,val所定义的变量即回收
注:只有val修饰的变量才能被lazy修饰;使用lazy定义变量后,只有在调用该变量时才会实例化这个变量的值。而且惰性变量只能是不可变变量;
3、包装类(富包装器)
原型 包装类 高级包装 java包装
byte Byte RichByte Byte
short Short RichShort Short
int Int RichInt Integer
long Long RichLong Long
char Char RichChar Character
float Float RichFloat Float
double Double RichDouble Double
boolean Boolean RichBoolean Boolean
BigInt BigInteger //存储大的整数
BigDecimal BigDecimal //存储位数比较多的小数
使用实例:
- val valchar: char = 'a'
- val valFloat: Float = 1.1F
- val valRichLong: RichLong = 1L
注:包装类是为了使基本类型转变为类。而高级包装(富包装器)则是在包装类的基础上扩展了很多其他的方法。
4、继承
Any则是AnyVal, AnyRef的父类。也就是说,Any是所有Scala类型的父类,它内置于Scala内部,由编译器实现。
AnyRef是所有「引用类型」的父(根)类
AnyVal是所有「值类型」的父(根)类
Null类型为所有引用类型的子类,其拥有唯一的实例:null。
Nothing:它是所有类的子类。
5、返回值(Unit、Option)
Unit类型是一个特殊的值类型,它等价于Java中的void。
Option:返回some类型具或NONE,由于有这个特性,在返回值中经常用,防止出现异常
- val arr = Array[Int](1,2)
- val value1: Option[String] = arr(1)
- val value2: Option[String] = arr(3)
- println(value1) // Some("value1")
- println(value2) // None
6、表达式
表达式:一个具有执行结果的代码块,分为条件表达式、块表达式
- val y = if (x > 0 ) 1 else -1 //条件表达式
- val res = { //块表达式
- if (x < 0) {
- -1
- } else {
- "error"
- }
- }
7、循环
- ①to、until
- println(1 to 10 ) //1-10
- println(1 until 10 ) //1-9,不打印最后一个数
- ②基础循环
- for( i <- 1 to 10 ){
- println(i)
- }
- ③多层循环
- for(i <- 1 to 10; j <- 1 until 10){
- println("i="+ i +", j="+j) //当i=1,j循环1-9;当i=2,j循环1-9
- }
- ④加条件循环
- for(i<- 1 to 10 ;if (i%2) == 0 ;if (i == 4) ){
- println(i) //4,当满足是偶数且i==4才输出
- }
- ⑤yield
- for( i <- 1 to 10 ) yield{
- i * 2 //返回乘以2以后的集合
- }
- ⑥跳出循环
- import util.control.Breaks._
- breakable(
- for(i<-0 until 10) {
- if(i==5){
- break() //如果i == 5,就终止breakable包裹的这一堆,此时类似于break
- }
- println(i)
- }
- )
- for(i<-0 until 10) {
- breakable{
- if(i==5){
- break() //如果i == 5,就终止breakable包裹的这一堆,此时类似于continue
- }
- println(i)
- }
- }
8、函数
- ①简单函数定义
- def fun (a: Int , b: Int ) : Unit = {
- println(a+b)
- }
- ②递归函数
- def fun(num :Int) :Int= {
- if(num ==1)
- num
- else
- num * fun2(num-1)
- }
- print(fun(5)) //求5的阶乘
- ③带默认值的函数
- def fun(a :Int = 10,b:Int) = {
- println(a+b)
- }
- fun(b=2)
- ④可变参数的函数
- def fun(elements :Int*)={
- var sum = 0;
- for(elem <- elements){
- sum += elem
- }
- sum
- }
- println(fun(1,2,3,4))
- ⑤匿名函数
- val value2 = ()=>{
- println(" ") //无参数匿名函数
- }
- val value3 = (a:Int,b:Int) =>{
- a+b //有参数的匿名函数
- }
- ⑥偏应用函数
- def log(date :Date, s :String)= {
- println("date is "+ date +",log is "+ s)
- }
- val date = new Date()
- val logWithDate = log(date,_:String)
- logWithDate("log11")
- //注:偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。
- ⑦生产函数
- def mulBy(factor : Double) = (x : Double) => factor * x
- val quintuple = mulBy(5) //quintuple=(x : Double) => 5* x
- quintuple(20) // 100
- //注:mulBy输入的是一个double类型,返回的是一个匿名函数
- ⑧函数柯里化
- //将一个函数变为两个函数的顺序调用。比如1+3+4 ,可以分为(1 + 3)+ 4 两个函数
- def add(x:Int,y:Int)=x+y <==> def add(x:Int)(y:Int) = x + y //调用:add(1,2)、add(1)(2)
注:方法和函数的区别
①Scala中使用val语句可以定义函数,def语句定义方法
②函数可作为一个参数传入到方法中,而方法不行
③方法转函数:val f1 = m _
9、高阶函数
定义:以函数作为参数或者返回值的函数
- ①函数作为值
- 声明:
- val f: (String, Int) => Char = _ . charAt (_)
- 调用:
- f("lihaozong",5);
- ②函数作为参数
- 声明:
- def P(f : (Double) =>Double) = f(0 . 25)
- 调用:
- P( ceil._ ) // 1 . 0
- 注:函数P的参数是一个函数f(输入、输出都是double),返回值函数f输入为0.25时的输出
10、对象、单例对象、伴生对象
单例对象:scala类的一个实例,使用class创建,但是在单例对象中没有静态方法和静态字段
伴生对象:在Scala的类中,与单例对象类名相同并且用object修饰的对象叫做伴生对象
①apply:当object进行初始化时、集合中取值时候(array(5)、list(1,2,3).foreach等)都要用到
②unapply(提取器):经常用在模式匹配或者偏函数中
注:伴生对象类似于java中的工具类,里面封装的静态成员
11、IO
- import scala.io.Source
- val source = Source.fromFile("1.txt", "UTF-8")
- for (line <- source.getLines) print(line)
12、闭包
定义:函数引用外部变量叫闭包。之所以要单独提出来,因为在分布式计算中,main方法中定义的全局变量,main中的方法不能直接使用Spark的Task调度器会把方法传给Excutor,但不能传递变量。这也是定义广播变量的原因
13、泛型
基础的泛型,此处不讲,主要讲的是比java中多出来的概念。
- 协变:对类型A和B,A是B的子类型,那么List[A]是List[B]的子类型
- def A(animals: List[Animal]): Unit = {....}
- val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
- A(cats) //根据协变List(Cat("Whiskers"), Cat("Tom")为 List[Animal]子类,可以调用
- 上界: T <: A ,表示类型变量 T 必须是 类型 A 子类
- class PetContainer[P <: Pet](p: P) {....} //输入参数p的类型P必须是类型Pet的子类
- 下界: B >: A 表示参数类型或抽象类型 B 须是类型A的父类
- def prepend[U >: B](elem: U): Unit ={...}
- 上下文界定:T : M, 其中M 必须为泛型类, 必须存在一个M[T]的隐式值
- class Pair_Context[T : Ordering](val first: T, val second: T){
- def smaller(implicit ord: Ordering[T]) =
- if(ord.compare(first, second) < 0) first else second
- }
1-scala基础的更多相关文章
- 【Scala学习之一】 Scala基础语法
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Scala学习(一)--Scala基础学习
Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...
- Scala基础(1)
Scala基础语法 声明与定义: val,常量声明 val x:T(把x声明成一个类型为T的常量) x是变量的名字,T是变量的类型 v ...
- scala 基础知识总结
在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...
- 1.scala基础语法总结
Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...
- Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...
- Scala 基础(7)—— 函数字面量和一等函数
1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...
- Scala 基础(5)—— 构建函数式对象
有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...
- Scala基础知识[一]
摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...
- Scala基础简述
* Scala基础简述 本文章作为Scala快速学习的教程,前提环境是:我假设在此之前,你已经学会了Java编程语言,并且我们以随学随用为目标(在此不会深度挖掘探讨Scala更高级层次的知识).其中语 ...
随机推荐
- java标识字
JAVA中,标识符, 指用于给变量.类.方法名 等命名的名称. 1,标识以数字,字符,下划线,以及美元$符组成.(不能包括@.%.空格等),不能以数字开头. 2,不能与JAVA关键字重复 3,严格区分 ...
- VMware下ubuntu与Windows实现文件共享的方法 (转)
最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下,就进行了共享文件夹的设置,期间遇到一些困难,记录下来,方便以后遇到此类问题不再困惑. (记录只为更好的分享) 言归正传: 1 ...
- ubuntu设置开机默认进入字符界面方法 ubuntu 12.04 桌面版关闭图形界面(转)
ubuntu 12.04 桌面版关闭图形界面 注意]改GRUB 的配置文件(不建议直接改 grub.conf) file:/etc/default/grub GRUB_CMDLINE_LINUX_DE ...
- 利用Jmeter批量数据库插入数据
1. 启动Jmeter 2. 添加 DBC Connection Configuration 右键线程组->添加->配置元件->JDBC Connection Configu ...
- C# 装箱
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- split与re.split/捕获分组和非捕获分组/startswith和endswith和fnmatch/finditer 笔记
split()对字符串进行划分: >>> a = 'a b c d' >>> a.split(' ') ['a', 'b', 'c', 'd'] 复杂一些可以使用r ...
- 基于STM32的红外遥控重点解析
本文有两个内容:一.红外遥控协议的的讲解:二.解码程序解析(参考正点原子的代码) 红外的介绍.优点.缺点就不给大家说了,进入正题 一.红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Pr ...
- Linux系统下启动tomcat报错【java.util.prefs.BackingStoreException: Couldn't get file lock】的解决方法
Linux环境下,启动tomcat报出如题的警告信息,虽然对系统正常使用没有多大影响,但是会导致tomcat的日志垃圾信息很多,而且看起来很不爽... 具体的警告信息如下: Jan , :: PM j ...
- VisualSVNServer 无法启动 could not log pid to file
启动SVN时候报了错误,然后查看日志发现报了如下错误 VisualSVNServer.exe: could not log pid to file C:/Windows/ServiceProfiles ...
- Python error: Microsoft Visual C++ 9.0 is required 解决方案
换了新电脑,在使用python2.7 pip 安装ipython时,报错了 error: Microsoft Visual C++ 9.0 is required. Get it from http: ...