目录

一、声明变量

二、类型推断定义变量

三、惰性赋值

四、字符串

双引号

插值表达式

使用三引号

五、数据类型与操作符

数据类型

运算符

scala类型层次结构

六、条件表达式

块表达式

七、循环

for表达式

while循环

八、break和continue

实现break

实现continue

九、方法

定义方法

返回值类型推断

十、方法参数

默认参数

带名参数

变长参数

十一、方法调用方式

后缀调用法

中缀调用法

花括号调用法

无括号调用法

十二、函数

定义函数

方法和函数的区别

方法转换为函数


一、声明变量

val/var 变量标识:变量类型 = 初始值
  1. val定义的是不可重新赋值的变量
  2. var定义的是可重新赋值的变量
  3. scala中定义变量类型写在变量名后面
  4. scala的语句最后不需要添加分号

二、类型推断定义变量

scala> val name = "tom"
name: String = tom

scala可以自动根据变量的值来自动推断变量的类型,这样编写代码更加简洁。

三、惰性赋值

当有一些变量保存的数据较大时,但是不需要马上加载到JVM内存。可以使用惰性赋值来提高效率。

语法格式:

lazy val/var 变量名 = 表达式

四、字符串

双引号

val/var 变量名 = "字符串"

插值表达式

插值表达式可以有效避免大量字符串的拼接。

val/var 变量名 = s"${变量/表达式}字符串"

在定义字符串之前添加s

在字符串中,可以使用${}来引用变量或者编写表达式

使用三引号

大段的文本需要保存,可以使用三引号来定义字符串。例如:保存一大段的SQL语句。三个引号中间的所有字符串都将作为字符串的值。

val/var 变量名 = """字符串1
字符串2"""
val sql = """select| *| from|     t_user| where|     name = "zhangsan""""println(sql)

五、数据类型与操作符

scala中的类型以及操作符绝大多数和Java一样

数据类型

基础类型

类型说明

Byte

8位带符号整数

Short

16位带符号整数

Int

32位带符号整数

Long

64位带符号整数

Char

16位无符号Unicode字符

String

Char类型的序列(字符串)

Float

32位单精度浮点数

Double

64位双精度浮点数

Boolean

true或false

注意下 scala类型与Java的区别

  1. scala中所有的类型都使用大写字母开头
  2. 整形使用Int而不是Integer
  3. scala中定义变量可以不写类型,让scala编译器自动推断

运算符

类别

操作符

算术运算符

+、-、*、/

关系运算符

>、<、==、!=、>=、<=

逻辑运算符

&&、||、!

  1. scala中没有,++、--运算符

与Java不一样,在scala中,可以直接使用==、!=进行比较,它们与equals方法表示一致。而比较两个对象的引用值,使用eq

scala类型层次结构

类型

说明

Any

所有类型的父类,,它有两个子类AnyRef与AnyVal

AnyVal

所有数值类型的父类

AnyRef

所有对象类型(引用类型)的父类

Unit

表示空,Unit是AnyVal的子类。它类似于Java中的void,但scala要比Java更加面向对象

Null

Null是AnyRef的子类,也就是说它是所有引用类型的子类。可以将null赋值给任何对象类型

Nothing

所有类型的子类 不能直接创建该类型实例,某个方法抛出异常时,返回的就是Nothing类型,因为Nothing是所有类的子类,那么它可以赋值为任何类型

六、条件表达式

条件表达式就是if表达式。scala条件表达式的语法和Java一样。

scala> val sex = "male"
sex: String = malescala> val result = if(sex == "male") 1 else 0
result: Int = 1

与Java不一样的是,

  1. 在scala中,条件表达式也是有返回值的
  2. 在scala中,没有三元表达式,可以使用if表达式替代三元表达式

块表达式

  1. scala中,使用{}表示一个块表达式
  2. 和if表达式一样,块表达式也是有值的
  3. 值就是最后一个表达式的值
scala> val a = {| println("1 + 1")| 1 + 1| }

七、循环

在scala中,可以使用for和while,但一般推荐使用for表达式,因为for表达式语法更简洁

for表达式

for(i <- 表达式/数组/集合) {// 表达式
}

简单循环

使用for表达式打印1-10的数字

参考代码1

scala> val nums = 1.to(10)
nums: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9,10)                                                                                 scala> for(i <- nums) println(i)

参考代码2

// 中缀调用法
scala> for(i <- 1 to 10) println(i)

嵌套循环

使用for表达式,打印以下字符

*****

*****

*****

for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}

守卫

for表达式中,可以添加if判断语句,这个if判断就称之为守卫。我们可以使用守卫让for表达式更简洁。

for(i <- 表达式/数组/集合 if 表达式) {// 表达式
}

示例

使用for表达式打印1-10之间能够整除3的数字

// 添加守卫,打印能够整除3的数字
for(i <- 1 to 10 if i % 3 == 0) println(i)

for推导式

在for循环体中,可以使用yield表达式构建出一个集合,我们把使用yield的for表达式称之为推导式

示例

生成一个10、20、30...100的集合

// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
val v = for(i <- 1 to 10) yield i * 10

while循环

scala中while循环和Java中是一致的

示例

打印1-10的数字

scala> var i = 1
i: Int = 1
scala> while(i <= 10) {| println(i)| i = i+1| }

八、breakcontinue

  • scala中,没有break/continue关键字
  • 如果一定要使用break/continue,就需要使用scala.util.control包的Break类的breablebreak方法。

实现break

用法

  1. 导入Breaks包import scala.util.control.Breaks._
  2. 使用breakable将for表达式包起来
  3. for表达式中需要退出循环的地方,添加break()方法调用

示例

使用for表达式打印1-100的数字,如果数字到达50,退出for表达式

// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
breakable{for(i <- 1 to 100) {if(i >= 50) break()else println(i)}
}

实现continue

用法

continue的实现与break类似,但有一点不同:

实现continue是用breakable{}将for表达式的循环体包含起来

示例

打印1-100的数字,使用for表达式来遍历,如果数字能整除10,不打印

// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
for(i <- 1 to 100 ) {breakable{if(i % 10 == 0) break()else println(i)}
}

九、方法

一个类可以有自己的方法,scala中的方法和Java方法类似。但scala与Java定义方法的语法是不一样的。

定义方法

def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {// 方法体:一系列的代码
}
  • 参数列表的参数类型不能省略
  • 返回值类型可以省略,由scala编译器自动推断
  • 返回值可以不写return,默认就是{}块表达式的值

示例

  1. 定义一个方法,实现两个整形数值相加,返回相加后的结果
  2. 调用该方法
scala> def add(a:Int, b:Int) = a + b
m1: (x: Int, y: Int)Int
​
scala> add(1,2)
res10: Int = 3

返回值类型推断

scala定义方法可以省略返回值,由scala自动推断返回值类型。

定义递归方法,不能省略返回值类型

定义递归方法(求阶乘)

10 * 9 * 8 * 7 * 6 * ... * 1

scala> def m2(x:Int) = {| if(x<=1) 1| else m2(x-1) * x| }
<console>:13: error: recursive method m2 needs result typeelse m2(x-1) * x

十、方法参数

scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:

  • 默认参数
  • 带名参数
  • 变长参数

默认参数

在定义方法时可以给参数定义一个默认值。

// x,y带有默认值为0
def add(x:Int = 0, y:Int = 0) = x + y
add()

带名参数

在调用方法时,可以指定参数的名称来进行调用。

def add(x:Int = 0, y:Int = 0) = x + y
add(x=1)

变长参数

如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。

def 方法名(参数名:参数类型*):返回值类型 = {方法体
}

在参数类型后面加一个*号,表示参数可以是0个或者多个

scala> def add(num:Int*) = num.sum
add: (num: Int*)Intscala> add(1,2,3,4,5)
res1: Int = 15

十一、方法调用方式

在scala中,有以下几种方法调用方式,

  • 后缀调用法
  • 中缀调用法
  • 花括号调用法
  • 无括号调用法

后缀调用法

这种方法与Java没有区别。

对象名.方法名(参数)

使用后缀法Math.abs求绝对值

scala> Math.abs(-1)
res3: Int = 1

中缀调用法

语法 注意空格

对象名 方法名 参数

例如:1 to 10

如果有多个参数,使用括号括起来

示例

使用中缀法Math.abs求绝对值

scala> Math abs -1
res4: Int = 1

操作符即方法

scala中,+ - * / %等操作符都是方法,操作符是一个方法名字是符号的方法。

花括号调用法

Math.abs{

// 表达式1

// 表达式2

}

方法只有一个参数,才能使用花括号调用法

使用花括号调用法Math.abs求绝对值

scala> Math.abs{-10}
res13: Int = 10

无括号调用法

如果方法没有参数,可以省略方法名后面的括号

  1. 定义一个无参数的方法,打印"hello"
  2. 使用无括号调用法调用该方法

参考代码

def m3()=println("hello")
m3()

十二、函数

定义函数

val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体

  • 函数是一个对象(变量)
  • 类似于方法,函数也有输入参数和返回值
  • 函数定义不需要使用def定义
  • 无需指定返回值类型
scala> val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>scala> add(1,2)
res3: Int = 3

方法和函数的区别

  • 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
  • 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
  • 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有

方法无法赋值给变量

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Intscala> val a = add
<console>:12: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.val a = add

方法转换为函数

  • 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数
  • 使用_即可将方法转换为函数
scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Intscala> val a = add _
a: (Int, Int) => Int = <function2>

【scala】基本介绍与用法(一)相关推荐

  1. Java 动态代理介绍及用法

    Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...

  2. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  3. chrome介绍与用法

    chrome介绍与用法 chrome介绍与用法 1. 认识devTools Elements 面板 console控制面板 Sources 资源面板 chrome介绍与用法 1. 认识devTools ...

  4. at指令 meid_AT指令介绍及用法,AT 指令集合

    AT指令介绍及用法,AT 指令集合 AT指令在当代手机通讯中起着重要的作用,能够通过AT指令控制手机的许多行为,包括拨叫号码.按键控制.传真.GPRS等.西门子M55手机为我提供了很多的AT指令,网络 ...

  5. C#中File和FileStream的简单介绍和用法

    前言 在近期的工作过程中发现自己的基础比较薄弱,所以最近在恶补基础知识.下面就对我所学习的File类和FileStream进行简单的总结. 1.首先先介绍File类和FileStream文件流 1.1 ...

  6. c语言isnumber函数用法,科技教程:ISNUMBER函数介绍及用法

    如今越来越多的小伙伴对于ISNUMBER函数介绍及用法这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类的信息,那么既然现在大家都想要知道I ...

  7. TS简单介绍以及用法

    TS简单介绍以及用法 一.什么是TS TS是TypeScript的缩写,是JavaScript的超集 (JS有的TS都有),也可以说TS是 type + js,加了一个类型.比如:JS:let a = ...

  8. C语言rand和srand函数的简单介绍和用法

    目录 介绍: 用法: 介绍: 在c语言中,我们想要在一个范围内随机生成一个数字,我们就需要用到rand函数,生成大小为0到32767的整数,但仅靠rand生成的数是伪随机的数,如下: 第一次运行n次: ...

  9. HTML中的link的简单介绍和用法

    <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <l ...

最新文章

  1. TCP连接的建立和终止
  2. richtextbox自动滚动到最下面_软网app:滚动截图将超长网页“一网打尽”
  3. 大盘点|卷积神经网络必读的 100 篇经典论文,包含检测 / 识别 / 分类 / 分割多个领域
  4. 如何成为一个优秀的高级C++程序员
  5. pcie16x能插1x的卡嘛?_5G手机插4G卡,在没有5G信号的地方,跟4G手机的网速一样吗?...
  6. 连接impala出现method not supported_Impala在网易大数据的优化和实践
  7. C# 多线程 学习
  8. python连接服务器informix_Python 用odbc连接Informix数据库 64位
  9. 【Unity3D】资源文件 ③ ( Unity 资源包简介 | 导出 Unity 资源包 | 导出资源包的包含依赖选项 | 导入 Unity 资源包 | Unity 资源商店 )
  10. B站被骂上了热搜。。
  11. UVA12096 - The SetStack Computer(set + map映射)
  12. 程序猿的自救 从零备考NSCA/CSCS 2 阻力运动生物力学
  13. android switch模块
  14. 计算机网络原理知识点及考点整理(谢希仁第七版)
  15. Python操作Excel(二)
  16. Qt LINK : fatal error LNK1104: 无法打开文件“xxx.lib”
  17. 微信小程序云开发-内容管理系统(CMS)小案例
  18. 常见的三种中文内码转换代码
  19. 开放网络–服务提供商的未来
  20. Adobe欲统一相机RAW格式的格式——DNG数码负片_我是亲民_新浪博客

热门文章

  1. DCDC常见问题之输出带载问题
  2. 怎样成为快速阅读的高手(下)
  3. vue +jpa 日期字段按年份查询解决方案
  4. 哪位大佬能够分享一下氧化石墨烯的cif,跪求!!!
  5. 【Oracle】session_cached_cursors和open_cursors的调整
  6. 互联网项目架构演变历史
  7. 中台产品经理宝典读后感(1):看懂企业业务演进路线
  8. POJ 图论分类 + DP(较全 自己又加了点)
  9. 网络安全基础——2.IP地址详解
  10. 22.1 网络编程:软件结构、网络通信协议、UDP与TCP协议、(网络编程三要素:协议、ip地址、端口号)、查看ip地址、检测网络是否连通、判断ip是否可用