Scala基础类型与操作
Scala基本类型及操作、程序控制结构
Scala基本类型及操作、程序控制结构
(一)Scala语言优势
自身语言特点:
- 纯面向对象编程的语言
- 函数式编程语言
函数式编程语言语言应该支持以下特性:- 高阶函数
- 闭包
- 模式匹配
- 单一赋值
- 延迟计算
- 类型推导
- 尾部调用优化
- 类型推导
- Scala语言具有很强的兼容性、移植性
运行于JVM上,能与JAVA相互操作 - Scala语法简洁
(二)Scala基本数据类型及操作
1. 变量定义
//声明一个val变量
//与Java final关键字声明的变量一样
//一旦被赋值,就不能更改
//Scala会帮我们进行类型判断
scala> val helloString="Hello World"
hellowString: String = Hello World
//也可以进行类型指定
scala> val helloString:String="Hello World"
helloString: String =Hello World
//String其实就是java.lang.String
scala> val helloString:java.lang.String="Hello World"
helloString: String = Hello World
//不能被重新赋值,因为它是val变量
scala> hellString="Hello Crazy World"
<console>:8: error:reassignment to val
helloString="Hello Crazy World"
下面给出的延迟加载变量:
//lazy关键字声明变量
//表示该变量不会马上赋值
//而在真正被使用时才赋值
scala> lazy val helloString="Hello Crazy World"
helloString: String = <lazy>
//在真正使用时被赋值
scala> helloString
res1: String = Hello Crazy World
scala中也存在可变变量,即随着程序的运行,变量内容可以动态变化:
//var 声明可变变量
scala> var helloString="Hello Cruel World"
helloString: String = Hello Cruel World
//重新赋值
scala> helloString="GoodBye Cruel World"
helloString: String = GoodBye Cruel World
整数类型变量定义:
//16进制定义法
scala> val x=0x29
x: Int = 41
//十进制定义法
scala> val x=41
x: Int=41
//八进制定义法
scala> 051
res0: Int = 41
浮点类型变量定义:
//Double类型定义,直接输入浮点数,编译器会将其自动推断为Double类型
scala> val doubleNumber=3.141529
doubleNumber: Double = 3.141529
//要定义Float类型浮点数,需要在浮点数后面加F或f
scala> val floatNumber=3.141529F
floatNumber: Float = 3.141529
scala> val floatNumber=3.141529f
floatNumber: Float = 3.141529
浮点类型的变量还可以采用指数表示法,如:
//浮点数指数表示法,e也可以是大写E,0.314529e1与0.314529*10等同
scala> val floatNumber=0.314529e1
floatNumber: Double = 3.14529
字符变量定义:
//字符定义,用""将字符包裹
scala> var charLiteral="A"
charLiteral: Char = A
常用特殊字符包括:
| \n | 换行符,其Unicode编码为(\u000A) |
|---|---|
| \b | 回退符,其Unicode编码为(\u0008) |
| \t | tab制表符,其Unicode编码(\u0009) |
| \”“ | 双引号,其Unicode编码为(\u0022) |
| \” | 单引号,其Unicode编码为(\u0027) |
| \ | 反斜杠,其Unicode编码为(\u005C) |
字符串变量跟java类似,就是加了” “。
字符串变量定义:
//字符串变量用""包裹
scala> val helloWorld="Hello World"
helloWorld: String = Hello World
//要定义"Hello World",可以加入转移符\
scala> val helloWorldDouble="\"Hello World\""
helloWorldDoubleQuota: String = "Hello World"
//如果希望能够原样输出字符串中的内容,则用三个引号'''符串包裹起来,如
scala> println('''hello cruel world, \n \\\\ \b \\, I am 'experienced' programmer''')
hello cruel world, \n \\\\ \b \\, I am 'experienced' programmer
布尔类型的定义:
scala> var x=true
x: Boolean = true
基本类型操作:
在Scala中一切操作皆方法,这意味着Scala中的一切皆为对象
//整数求和,编译器会将其转换为(1).+(2)执行
scala> var sumVlaue=1+2
sumVlaue: Int = 3
//前一语句等同于下列语句
scala> var sumVlaue=(1).+(2)
sumVlaue: Int = 3
//操作符重载函数,编译器会将其转换为(1).+(2L)执行
scala> val longSum = 1+2L
longSum: Long = 3
//减法
scala> 1-3
res5: Int = -2
//除法
scala> 1/3
res6: Int = 0
//取模
scala> 1%3
res7: Int = 1
//乘法
scala> 1L*3L
res8: Long = 3
//scala中可以用+ -符号来表示正负数,例如-3 +3,并且可以加入到运算符中
scala> var y=1+ -3
y: Int = -2
关系运算:
//>运算符
scala> 3 > -3
res12: Boolean = true
//<运算符
scala> 3 < -3
res13: Boolean = false
//<=运算符
scala> 3 <= -3
res14: Boolean = false
scala> 3 <= 3
res15: Boolean = true
scala> !(3<= -3)
res16: Boolean = true
逻辑运算:
//逻辑与:&&
scala> val bool=true
bool: Boolean = true
scala> bool && bool
res17: Boolean = true
//逻辑或: ||
scala> bool || bool
res18: Boolean = true
scala> bool || !bool
res20: Boolean = true
//00000001
//11111110
scala> ~1
res24: Int = -2
//左移位(shift left)
//00000110
//00001100
scala> 6 << 1
res29: Int = 12
//右移位(shift left)
//00000110
//00000011
scala> 6 >> 1
res26: Int = 3
对象比较:
scala> 1==1
res34: Boolean = true
scala> 1==1.0
res35: Boolean = true
scala> val x="Hello"
x: String = Hello
scala> val y="Hello"
y: String = Hello
//Scala中的对象比较不同于Java中的对象比较
//Scala基于内容比较,而Java中比较的是引用,进行内容比较时须定义比较方法
scala> x==y
res36: Boolean = true
(三)Scala程序控制结构
if的使用:
val x= if("hello"=="hell") 1 else 0
while的使用:
def gcdLoop(x:Long,y:Long):LOng ={
var a=x
var b=y
while(a!=0){
val temp = a
a = b%a
b = temp
}
b
}
do while的使用:
var line=""
do{
line=readLine()
println("Read:"+line)
}
while(line!="")
注意:与if不同的是,while与do while不能用作表达式,也即其返回值为Unit,在某些函数式编程语言中,删除了while与do while程序控制结构,但scala仍然保留了while与do while,可见Scala并不是纯函数式编程语言(另外一个很重要原因是,Scala函数定义时仍然可以用var指定参数)
var line = ""
while((line=readLine())!="")//在Scala中不能这么用,因为Scala中的赋值操作返回的值是Unit,而""是String类型,不能进行比较,这是函数式编程语言特有的特点
println("Read:"+line)
for循环的使用:
scala> val filesHere = (new java.io.File(".")).listFiles
//集合操作方式
scala> for (file<-filesHere)
| println(file)
//间接调用方式(不常用)
for (i <- 0 to filesHere.length - 1)
println(filesHere(i))
程序中的<-被称为生成器(generator),在执行过程中,集合filesHere中(Array[File])的元素将依次赋给file,file类型为File,打印时调用其toString方法将文件名称打印出来。
多重for循环的使用:
for循环同样可以有返回值:
Scala基础类型与操作的更多相关文章
- Java基础类型自动装箱(autoboxing)
Java SE 1.5 版本及之后,开始提供自动装箱功能. 自动装箱,将基础类型“包装”成一种类型: 基本类型 --> 包装器类 如下过程可触发自动装箱过程: Integer count = ...
- 第1节 Scala基础语法:5、6、7、8、基础-申明变量和常用类型,表达式,循环,定义方法和函数
4. Scala基础 4.1. 声明变量 package cn.itcast.scala object VariableDemo { def main(args: Array[Strin ...
- 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...
- 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...
- 【scala】基础类型
基础类型 位数 Boolean - Byte ...
- Scala 基础(3)—— 基础类型和基础操作
1. Scala 的一些基础类型 Scala 提供了 8 种基础类型,对应 Java 的 8 种基本数据类型. 其中包括: 整数类型:Byte, Short, Int, Long, Char 浮点类型 ...
- Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变
1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...
- Scala 基础入门【翻译】
原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变量 val.可变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果 ...
- 大数据入门第二十天——scala入门(二)scala基础01
一.基础语法 1.变量类型 // 上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型.在scala是可以对数字等基础类型调用方法的. 2.变量声明——能用val的尽量使用val! ...
随机推荐
- Repeater获取某一行TextBox值
TextBox tb = (TextBox)e.Item.FindControl("TextBoxID");
- 说说VS 2015 RC最新开发工具的体验
有两个我感觉是提高效率的地方: 1.智能提示的改进,鼠标只要移动到代码上面的类型.字段,就会显示相应的提示,这大大提高我们开发时候需要按F12才能看到定义的内容.下面上图,给大家形象化: 2.管理Nu ...
- U3D学习使用笔记(四)
1.Unity3D项目实战笔记(5):延时功能的几种实现 http://www.xifarm.com/invoke/ 2.动画运行出屏幕范围时消失 Animation CullingType 3.No ...
- Docker容器的网络连接
Docker容器的网络连接 Docker容器的网络连接 我们用ifconfig命令来查看网络设备 我们可以看到上面有个叫docker0的网络设备,docker守护进程就是通过docker0为docke ...
- 解决apache启动问题:httpd: Could not reliably determine the server's fully
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for Se ...
- gets和fgets函数的区别
1. gets与fgets gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名. gets函数功能:从键盘上输入字符,直至接受到换行 ...
- 关于继承UITableViewController若干问题
// // MSHomeCommentTableViewController.m // xiaoqu-ios // // Created by Charlie on 15/7/1. // Copyri ...
- Oracle EBS-SQL (GL-1):从总帐追溯到接收
SELECT je_header_id, je_line_num, trx_class_name, trx_type_name, trx_number_displayed, trx_date,comm ...
- IE兼容性bug汇总
1.IE6的双边距BUG. 发生条件:如果有元素是浮动元素,则该元素与它的父元素(一般是一个容器)直接相接触(中间不能隔着其他元素)的左或右的边距就会产生双倍边距,也意味着相邻的兄弟元素不可能会产生双 ...
- 解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)
2014-08-23 今天开始学习Node.js,在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错代码所在如下: function upload(response,reques ...