关于Scala的理解

scala简介

scala是运行在JVM上的多范式(多种编程方法)编程语言,同时支持面向对象和面向函数编程
早期,scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。

为什么用scala

开发大数据应用程序(Spark程序、Flink程序)
表达能力强,一行代码抵得上Java多行,开发速度快
兼容Java,可以访问庞大的Java类库,例如:操作mysql、redis、freemarker、activemq等等

使用scala所需要的环境

JDK
scala SDK

scala基础声明格式

声明变量

var/val  变量名:变量类型=默认值
例:var/val name:String=“张三”
var  变量值可以改变
val 变量值不可改变

三引号

 当我们有大端代码时可以使用三引号
例 
var name=“”“select
 *
 from
     t_user
 where
    name = "zhangsan”“”

变量类型推断

	scala会根据初始值推断变量类型
	例 var name="张三" 
	scala会推断name是String类型 次数不用声明数据类型

惰性赋值

惰性赋值就是不会立即加载到内存中 当调用时才会加载到内存中
格式
lazy val  变量名 = 表达式\

插值表达式

 var/val 变量名=s"$s{变量名}"
 例
	 val sex = "male"
	 val info=" s"name=${name}"
	 print(info)
	 name=zhangsan

数据类型与操作符

数据类型

基础类型			类型说明
Byte	      	8位带符号整数
Short			16位带符号整数
Int				32位带符号整数
Long			64位带符号整数
Char			16位无符号Unicode字符
String			Char类型的序列(字符串)
Float			32位单精度浮点数
Double			64位双精度浮点数
Boolean			true或false

运算符

类别		操作符
算术运算符	+、-、*、/
关系运算符	>、<、==、!=、>=、<=
逻辑运算符	&&、||、!

注意
scala中没有,++、–运算符
在scala中,可以直接使用==、!=进行比较,它们与equals方法表示一致。而比较两个对象的引用值,使用eq

scala类型结构

类型		说明
Any			所有类型的父类,,它有两个子类AnyRef与AnyVal
AnyVal		所有数值类型的父类
AnyRef		所有对象类型(引用类型)的父类
Unit		表示空,Unit是AnyVal的子类。它类似于Java中的void,但scala要比Java更加面向对象
Null		Null是AnyRef的子类,也就是说它是所有引用类型的子类。可以将null赋值给任何对象类型
Nothing		所有类型的子类 不能直接创建该类型实例,某个方法抛出异常时,返回的就是Nothing类型,因为Nothing是所有类的子类,那么它可以赋值为任何类型

在这里插入图片描述

for表达式

格式
for(i <- 表达式/数组/集合) {
// 表达式
}
例
for(i <- 1 to 10) println(i)

嵌套循环

for(i <- 表达式1,j<-表达式2) {
// 表达式
}
例
for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}
打印内容
*****
*****
*****   

守卫

使用守卫让for表达式更简洁
格式  for(i <- 表达式/数组/集合 if 表达式) {
// 表达式
}
例
// 添加守卫,打印能够整除3的数字
for(i <- 1 to 10 if i % 3 == 0) println(i)

for推导式

使用yield的for表达式称之为推导式
格式
	// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
val v = for(i <- 1 to 10) yield  表达式
例 使原有的数字扩大10倍
val v = for(i <- 1 to 10) yield i * 10

break

scala中,没有break/continue关键字
如果一定要使用break/continue,就需要使用scala.util.control包的Break类的breable和break方法。	
导入Breaks包import scala.util.control.Breaks._
使用breakable将for表达式包起来
for表达式中需要退出循环的地方,添加break()方法调用
例
// 导入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)
  }
}

方法

格式
def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
  // 方法体:一系列的代码
}

参数列表的参数类型不能省略
返回值类型可以省略,由scala编译器自动推断
返回值可以不写return,默认就是{}块表达式的值
例
def add(a:Int, b:Int) = a + b

函数

格式
val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体
	
函数是一个对象(变量)
类似于方法,函数也有输入参数和返回值
函数定义不需要使用def定义
无需指定返回值类型
例
val add = (x:Int, y:Int) => x + y

方法和函数的区别

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

方法转换为函数

有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数
使用_即可将方法转换为函数
val 函数名 = 方法名  _
注意 方法名后带空格
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值