博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala编程及基础
阅读量:3958 次
发布时间:2019-05-24

本文共 2806 字,大约阅读时间需要 9 分钟。

Scala概念

Scala是一种多范式的,面向对象的和函数式编程的语言。Scala运行于jvm,并兼容现有Java程序

Scala优点

速度快Scala代码比Java简洁,开发速度快

Spark实现语言Hadoop是大数据标准,Spark完善Hadoop生态

Scala基础

1、声明变量

scala 中没有 static 关键字,scala object 中所有成员变量和方法默认都是 static 的

Scala声明变量两种方式,val和var

val / var 变量名 : 变量类型 = 变量值

val定义的值是不可变的,它不是一个常量,是不可变量

提示

1、scala默认为匿名变量分配val

2、为减少可变性引起bug,应尽可能使用不可变变量val

3、val定义的变量不能改变其引用的内存地址,但是可以改变其引用的对象的内部的其他属性值

常用类型

Scala和Java一样,有8种数据类型: 7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型,与Java中的数据类型不同,不区分基本类型和引用类型,这些类型都是对象,可调用相应方法

Boolean

true 或者 false

Byte

8位, 有符号

Short

16位, 有符号

Int

32位, 有符号

Long

64位, 有符号

Char

16位, 无符号

Float

32位, 单精度浮点数

Double

64位, 双精度浮点数

String

其实就是由Char数组组成

常用类型结构图

Scala中,所有的类都最终继承自根类型Any,它有两个子类:AnyVal和AnyRef

Unit类型用来标识过程,即没有返回值的函数。 Unit类似于Java里的void。Unit只有一个实例(),它没有实质的意义

Null是所有引用类型AnyRef的子类型。Null类只有一个实例对象,null。null可以赋值给任意引用类型,但不能赋值给值类型

Nothing是所有类型的子类,也是Null的子类。Nothing没有实例对象,但可用来定义类型。例,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回)

算数操作符重载

+ - * / 可以完成和Java中相同的工作,但它们都是方法。方法的使用方式是“实例对象.方法名(参数列表)”

1 + 2  等同于  1.+(2)

条件表达式

Scala的的条件表达式比较简洁

 

    val z = if (x > 1) 1 else "error"

提示

scala中没有三目运算符,因为if else表达式是有返回值的

若缺少判断,什么都不返回,则返回Unit类的实例对象,()无用占位符,相当于java中的void

行尾的位置不需要分号,只要能够从上下文判断出语句的终止即可。但如果在单行中写多个语句,则需要分号分割

块表达式

Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值

val result= {

      1+2
      4>5
    }
println(result)

循环

for 推导式约定:当for 推导式仅包含单一表达式时使用(),当其包含多个表达式时使用{}

(1)while表达式

While语句本身没有值,返回结果是Unit类型的

while循环

var n = 1

val w = while(n <= 10){

  n += 1

}

println(w)

println(n)

(2)for表达式

for循环语法结构:for (i <- 表达式/数组/集合)

//1 to 3,Range为1,2,3//1 until 3,Range为1,2for(i <- 1 to 3){  println(i)}for(i <- 1 until 3) {  println(i)}

说明:Scala没有break或continue语句来退出循环。如果需要break时有如下几个选择:

1、使用Boolean型的控制变量;

2、使用嵌套函数--你可以从函数当中return;

3、使用Breaks对象中的break方法:

//continue例子for (i <- 1 to 10) {  Breaks.breakable{    if (i == 2) Breaks.break    println(i)  }}//break例子Breaks.breakable{  for(i<-1 to 10){    if(i==5){      Breaks.break    }    println(i)  }}//可以认为breakable处理掉了break抛出的异常//retrunfor(i <- 1 to 10){  if(i==2) return  println(i)}

倒序输出

//Range(起始,结束,步长)前闭后开for(i <- Range(10 , 1,-1)){      println("i = "+i)}for(i <- (1 to 10).reverse){  println("i = "+i)}

方法&函数

 (1)定义方法

//def定义 方法名 参数列表 =分隔符 方法体

def m(x:Int,y:Int) = x+y println(m1(1,2))

(2)定义函数

//val var def 定义函数名 参数列表 =>分割符 方法体

var m2 = (x:Int,y:Int)=>x+y println(m2(1,2))

定义函数时,使用val、var、def都可以,函数原型与函数体的分隔符是=>,函数定义不能写返回值类型

(3)方法和函数的区别

案例:将函数作为方法的参数传入

def m1(x: Int, y: Int, f: (Int, Int) => Int): Int = {

f(x, y) 

}

(4)将方法转换成函数(神奇的下划线)

def m1(x: Int, y: Int, f: (Int, Int) => Int): Int = { f(x, y) }

var m2 = m1 _
println(m2) 

闭包

//方法的方法体是函数,方法的返回值是一个函数

def c1(more:Int) = (x:Int)=>x*more

println(c1(3))//返回值是只有一个参数的函数

println(c1(3)(4))

懒值

当val被声明为lazy时,它的初始化将被推迟,直到首次对此取值

def init():String={  println("emmm")  "yes"}var x ="aaa"//val a = init()lazy val a = init()println(x)

 

 

 

 

 

转载地址:http://yvazi.baihongyu.com/

你可能感兴趣的文章
类结构定义
查看>>
Windows下关于多线程类 CSemaphore,CMutex,CCriticalSection,CEvent,信号量CSemaphore的使用介绍
查看>>
图像处理基本算法(汇总)以及实现
查看>>
C++编程获取本机网卡信息 本机IP 包括Windows和Linux
查看>>
23种设计模式详解及C++实现
查看>>
C++连接CTP接口实现简单量化交易
查看>>
服务端使用c++实现websocket协议解析及通信
查看>>
C# string.Format使用说明
查看>>
Linux下安装Mysql数据库开发环境
查看>>
Linux用户及用户组添加和删除操作
查看>>
通用 Makefile 的编写方法以及多目录 makefile 写法
查看>>
C++的4种智能指针剖析使用
查看>>
RPC框架实现之容灾策略
查看>>
Docker私库
查看>>
hdu——1106排序(重定向)
查看>>
hdu——1556Color the ball(树状数组)
查看>>
hdu——1541Stars(树状数组)
查看>>
快速幂的精简代码
查看>>
求大数乘方的前n位数字(对数加快速幂)
查看>>
hdu——2602Bone Collector(第一类背包问题)
查看>>