val file = scala.io.Source.fromFile("input/word.txt")
import java.io.File
import java.io.PrintWriter
val writer = new PrintWriter(new File("input/word.txt"))
writer.write("hello world")
writer.close()
数据类型:
-
全部:
Any
AnyRef 引用类型
Array
List
ArrayList
Set
Null
AnyVal 数据类型
Short
Int
Long
Float
Double
Unit
ShringOps
Char
Boolean
Byte
Nothing
-
整数类型
-
Byte
-128
到
127
-
Short
-32768
到
32767
-
Int
± 20e
-
Long
>±20e
val b1: Byte = -128
val b2: Byte = 127
val s1: Short = 32767
val s2: Short = -32768
val i1 = 2000000000
val i2 = -2000000000
val l1 = 20000000000L
val l2 = -20000000000L
-
浮点类型
-
Float
单精度
-
Double
双精度
-
字符类型
-
Char
使用单引号
val c1: Char = '0'
val c2: Char = '\n'
print("abc" + c2 + "def")
-
String
-
布尔类型
-
Boolean
True
False
-
空类型
-
Unit 空值
和其他语言 void 一样 用作不返回结果的方法类型 写成() 空括号
Null 的 唯一实例 null
val n: Array[String] = null
所有类型的子类
def f2(n: Int): Nothing = {
if (n == 0) {
throw new NullPointerException
throw new Error("hello world")
f2(1)
def f2(n: Int): Int = {
if (n == 0) {
throw new NullPointerException
} else {
val b1: Byte = 1
val i1: Int = b1
// 自动转换
val i2: Int = 1
val b2: Byte = i2.toByte
-
toString 转String
-
toInt 转Int 以此类推
Char 转 Byte 时 IDEA不会报错 但编译器会报错 要使用toByte
运算符:
计算运算符:
-
+
相加或者代表字符串的连接
-
-
相减
-
*
相乘
-
/
相除
-
%
取余
关系运算符:
-
==
等于
-
≠
不等于
-
>
大于
-
<
小于
-
≥
大于等于
-
≤
小于等于
逻辑运算符:
println(true && true) // True
println(false && true) // False
println(false && false) // False
println(true || true) // True
println(false || true) // True
println(false || false) // False
println(!true) // False
println(!false) // True
赋值运算符:
-
=
直接赋值
-
+=
相加赋值
-
-=
相减赋值
-
*=
相乘赋值
-
/=
相乘赋值
-
%=
求余赋值
循环(loop):
while 循环:
while (条件) {
for 循环:
for (i <- 0 to 10) {
0 - 10 包含 10
for (i <- 0 until 10) {
0 - 9 不包含 10
val array = Array[String]("hello", "world", "nmsl")
// 循环一个可迭代对象 ①
for (i <- array) {
println(i)
// 等价于 ②
for (i <- 0 until array.length) {
println(array(i))
// 等价于 ③
for (i <- array.indices) {
println(array(i))
for 循环过滤:
for (i <- 1 to 9) {
for (j <- 1 to 9 if j < i) {
print(f"${j}*${i}=${i*j} ")
println()
// 打印所有奇数
for (i <- 0 to 100 if i % 2 == 1) {
println(i)
yield 储存循环算法 类似于Python列表生成器
val 奇数 = for {i <- 0 to 10 if i % 2 == 1} yield i
for (i <- 奇数) {
println(i)
}
方法和函数(function and method):
-
val
定义函数
-
def
定义方法
-
传名调用
当参被用到再计算其值
-
传值调用
当传入时计算其值
-
函数柯里化
使用以下方式定义函数
def add(x:Int)(y: Int) = x + y
val y = 1
def add(x: Int) = x + y
这个add方法就是闭包 因为他用到了外部变量
当定义她时y被封装
数组(Array)
val array1: Array[String] = new Array[String](3)
array1(0) = "hello"
array1(1) = "hello"
array1(2) = "nmsl"
val array2 = Array("hello", "nmsl")
// 求最值
val num_array = Array(1,2,3,465,4,65,4,46,456,423,1,465,45,1,321,564,56,561,651,561,56156,56,165,156,1,561,561,56,156,156,156,1,561)
var max_number = num_array(0)
for (i <- num_array) {
if (i > max_number) {
max_number = i
println("最大的数" + max_number)
// 创建
val Matrix = Array.ofDim[Int](3, 3)
// 多维数组打印
for (i <- 0 to 2) {
for (j <- 0 to 2) {
Matrix(i)(j) = j // 赋值
print(" " + Matrix(i)(j))
println()
val range1 = Range(1, 10)
println(range1)
println("他的类型:" + range1.getClass)
>>Range 1 until 10
>>他的类型:class scala.collection.immutable.Range
他储存的是算法所以不占真实的内存空间(如果不迭代)
他是一个可迭代类型
scala.collection
Range是一个类 和Python range函数差不多 有三个参数
-
start
开始值
-
stop
结束值 不包括
-
step
步进
-
常用函数
-
Array.concat
连接
-
Array,copy
拷贝
集合(Coliiection)
List
val list1: List[String] = List("hello", "world") // 字符串列表
val list2: List[Any] = List("hello", 123) // 可以存在不同的类型
val list3: List[String | Int] // Scala3 的写法 Scala2 报错
val list3: List[Nothing] = List() // 空列表
val list4: List[List[Int]] = List( // 二维列表
List(1,2,3),
List(4,5,6),
List(7,8,9)
// list4.head 获取第一个值
// list4.tail 获取最后一个值
// list4.isEmpty 判断是否为空
// val res = list1 ::: list2 连接list 返回list
val list6 = List.fill(5)("nmsl") // 柯里函数 填充一个值到列表 5是重复次数
>>List(nmsl, nmsl, nmsl, nmsl, nmsl)
val list7 = List.tabulate(100)(x => x * x) // 柯里函数 生成一个列表 0 until x (这里是100) 然后执行一个函数 结果保存到 list7
println(list7.reverse) // 翻转一个List
Set