锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

scala编程(初级)

时间:2022-09-21 14:30:01 q18j5a连接器

Scala

scala安装

#编译运行scala程序,需要:     JDK(jvm)      Scala编译器(scala SDK) 
安装JDK (java解释器)
#安装JDK 1.8 64位, 并配置环境变量. 
安装Scala SDK (scala解释器)
#安装Scala SDK   windows : scala-2.12.1.msi  Linux : scala-2.11.12.tar.gz   安装后,测试安装是否成功: scala -version 
安装IDEA插件
#先下载idealU  #然后下载Idealu支持Scala的插件  具体步骤占时略 

概念

scala简介

//scala 运行在Jvm上这点和Java一样。 Scala多范式编程语言。 //scala支持面向对象和函数编程。 //scala刚出来的时候是个小语种。但随着它的出现Spark,Kafka等基于Scala大数据框架的兴起,Scala就火了呀。 //scala优点是它的表达。 

为什么使用Scala?

//开发大数据应用(Spark, Flink)  ///表达能力强,一行相当java多行  //兼容java,可访问庞大的Java类库。例如Mysql, redies, freemrker activemq 等 

Scala和Java对比

//java代码繁琐, Scala代码相对简单. (三行Scala值34行Java. 夸张地说!  ///批量操作,scala一行map差不多够了,但是Java便于循环处理  

Scala编译执行过程

java如何编译程序?.执行的?

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-kG0zE3s7-1658546372321)(scala.assets/image-20211027213633410.png)]

scala如何编译和执行程序?

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-IHPPUNlx-1658546372323)(scala.assets/image-20211027213836372.png)]

// java编译器和scala编译器不通用.  // scala也有自己的类库, scala也可以使用java类库哦.  // scala 

基础

交互式,文件式例子

交互式

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-grLBWoIS-1658546372323)(scala.assets/image-20210830133231577.png)]

文件式

//HelloWorld.scala 代码如下:  object HelloWorld { 
            /* 这是我的第一个 Scala 程序 * 输出以下程序Hello World!' */    def main(args: Array[String]) { 
               println("Hello, world!") // 输出 Hello World    } } 

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-2dgHhZh3-1658546372324)(scala.assets/image-20210830133434401.png)]

注意语法

#1. 区分大小写 - Scala大小写敏感,这意味着标志Hello 和 hello在Scala会有不同的含义。  #2. 类名 - 大写所有类名的第一个字母。如果需要用几个单词来形成一个类的名称,每个单词的第一个字母应该大写。  示例:class MyFirstScalaClass  #3. 方法名称 - 所有方法名称的第一个字母都是小写的。若用于构成方法的单词名称,则每个单词的第一个字母应大写。  示例:def myMethodName()  #4. 程序文件名 - 程序文件的名称应与对象名称完全匹配(不需要新版本,但建议保留此习惯)。保存文件时,应保存使用的对象名称(记住Scala区分大小写)并添加".scala"扩展文件名称。 (如果文件名与对象名不匹配,程序将无法编译)。  示例: 假设"HelloWorld"/span>是对象的名称。那么该文件应保存为'HelloWorld.scala" #5. def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。 

Scala 变量

// 1.scala中var声明变量,val声明常量
	val定义的变量不可以重新赋值,但是var定义的可以.
// 2.Scala 可以使用类型推断。
	val name = "占山"

惰性赋值

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

//语法:
	lazy val/var 变量名 = 表达式

例如有个复杂的Sql语言,我们希望只有用到SQL语句的时候才加载他.。 如果不使用lazy,就直接加载到内存了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEWagGoH-1658546372324)(scala.assets/image-20211028100331149.png)]

数据类型

//scala中有着与java相同的数据类型。 如下说说与之不同的地方:
	scala中所有的类型都使用大写字母开头。
	整形使用Int,而不是Integer
	scala 申请变量的时候可以不写类型,让scala编译器自己推断去吧。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpEVg3jR-1658546372325)(scala.assets/image-20210830135413572.png)]

Scala类型层次结构

//Scala的数据类型也是“单根继承”体系, 都是继承Any这个类型

//AnyVal 是所有“值类型”的父类。
//AnyRef 是所有“引用类型”的父类

//Unit 表示“空类型”
	他只有一个实例() 。它类似于java中的void, 但是scala比java更加的面向对象。

//Null 所有“引用类型”的子类。
	也就是Nul类型可以赋值给所有“引用类型”

//Nothing 所有类型的子类。 
	Nothing 表示方法抛出异常的时候,返回的子类。。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qauj3vwv-1658546372325)(scala.assets/image-20211028104338861.png)]

Null 类型是不可以赋值给 AnyVal 下面的类型的, 只可以赋值给AnyRef下的类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tJBvySMO-1658546372326)(scala.assets/image-20211028110559816.png)]

运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCzNU0pw-1658546372326)(scala.assets/image-20211028103114605.png)]

条件表达式(if)

//if 的使用,语法和java一样。在此不多bb。 下面主要说和java不一样的地方:
	Scala中if是有返回值的。
	Scala中没有三元表达式,可以使用if表达式代替 三元表达式

有返回值的if

例:当sex 是 “male”就返回1 , 否则就返回0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gq23e7w-1658546372327)(scala.assets/image-20211028113904773.png)]

块表达式

//scala中使用{} 表示块表达式if表示式一样,块表达式也是有值的。值就是最后一个表达式的值。

// 块表达式是很牛逼的一个东西。这玩意用的好,代码就精巧。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0yxjpK9-1658546372327)(scala.assets/image-20211028115157383.png)]

循环

for

遍历循环1到9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PStir5sz-1658546372328)(scala.assets/image-20211028150220215.png)]

在scala中,数字也是一个对象,也可以调用 .to方法。

//scala中 x.to(y) 相当于 python 中 range(x, y+1)

// 1.to(10) 也可以写成 1 to 10

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CUMIEne-1658546372328)(scala.assets/image-20211028150629317.png)]

for嵌套循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8AR7aK0Q-1658546372329)(scala.assets/image-20211028152304039.png)]

for的守卫

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

语法:

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

//表示,当if后面这个表达式式True的时候,才能进入下面的操作。

例:用for表达式打印1-10之间内 能整除3的数字

for(i <- 1.to(10) if(i%3==0)){ 
        
    println(i)
}

等价于:

for(i <- 1.to(10)){ 
        
    if(i%3==0){ 
        
    	println(i)
    }
}
for 的推导式
// 可以使用for推导式 生成一个心的集合(一组数据)
// 我们把 使用yield的for表达式称之为“推导式”

例:生成10, 20, 30, … 100

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDlFwySD-1658546372329)(scala.assets/image-20211028154508520.png)]

跟python的 v = [ i*10 for i in range(11)] 有点像哦。

while

略。

do … while

略。

break

* 在scala中,类似Java和C++的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类似,但有一点不同:
	实现break是用breakable{ 
        }将整个for表达式包起来,
	而实现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 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。

Scala 中的方法跟 Java 的类似,语法不一样,方法是组成类的一部分.

Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。

Scala 中使用 val 语句可以定义函数,def 语句定义方法。

注意:有些翻译上函数(function)与方法(method)是没有区别的。

方法

语法

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


/* * 参数列表的参数类型不能省略 * 返回值类型可以省略,由scala编译器自动推断 * 返回值可以不写return,默认就是{}块表达式的值 */

例:定义一个方法,实现两个整形数值相加,返回相加后的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MqCqlpd-1658546399390)(scala.assets/image-20211028161335519.png)]

标准写法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bB9fBOOr-1658546399391)(scala.assets/image-20211028162119791.png)]

返回值推断
//scala定义方法可以省略返回值,由scala自动推断返回值类型。这样方法定义后更加简洁。 
//定义递归方法,不能省略返回值类型
//return 什么时候都可以不写,看你心情。

例:定义递归方法(求阶乘)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R2mn2JxF-1658546399392)(scala.assets/image-20211028162618915.png)]

方法的参数
scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:
    - 默认参数 (和py一样)
    - 带名参数 (和py一样)
    - 变长参数 ( *

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXUIZ0qW-1658546399392)(scala.assets/image-20211028163213593.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CecpdFQc-1658546399393)(scala.assets/image-20211028163303876.png)]

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

语法格式:

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

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

**例子:**定义一个计算若干个值相加的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rmKjRe2-1658546399394)(scala.assets/image-20211028164018151.png)]

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j12uuZkv-1658546399394)(scala.assets/image-20211028164038011.png)]

疑问:不定长参数的类型式什么?猜想是数组。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SNdvULt-1658546399395)(scala.assets/image-20211028164145483.png)]

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWdxewcX-1658546399395)(scala.assets/image-20211028164204031.png)]

答疑:是WrappendArray() ? 还是Seq[Int] ?

方法调用方式
//在scala中,有以下几种方法调用方式,
  后缀调用法		
  中缀调用法		
  花括号调用法
  无括号调用法

//在后续编写spark、flink程序时,我们会使用到这些方法调用方式。

1.后缀调用法

语法: 对象名.方法名(参数)

例:

Math.abs(-1)
1.to(10)

2.中缀调用法

语法: 对象名 方法名 参数 ; 如果有多个参数,使用括号括起来

例:

Math abs -1
1 to 10	 

3.花括号调用法

//方法只有一个参数,才能使用花括号调用法
Math.abs{ 
        -10}

//{}表示块表达式,快表达式的返回值就是最后一个表达式(之前说过,别忘了)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5lavozL-1658546399396)(scala.assets/image-20211029113909816.png)]

4.无符号调用法

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

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

5.操作符也是方法

在scala中:
	所有的操作符都是方法
	操作符是一个方法名字是符号的方法.

1 + 1 这个表达式实际上也是一个方法调用哦。scala的特别之处,嘻嘻。

//下面不写不知道,一写么的吓一跳。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70lgbz2i-1658546399396)(scala.assets/image-20211029113709782.png)]

函数

// scala支持函数是编程, 这个在编程Spark/flink程序中会大量使用,真特么重要。

/* 函数是一个 对象(变量) 类似于方法,函数也有输入参数和返回值 函数定义不需要使用def 定义 无需指定返回值类型 */

语法

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


猜想:
等价于python中  函数命=lambda 参数1,参数2 ... :函数体   (如:x = lambda x: x+1)

:定义两个数值相加的函数

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这些方法。方法则没有 */

**例:**方法无法赋值给变量,函数可以

既:
val 变量 = 函数名 ;   是正确的
	此时 这个变量就是个函数。
val 变量 = 方法名 ;	 是错误的




scala> val add1 = (x:Int, y:Int) => x+y
add1: (Int, Int) => Int = $$Lambda$1092/256869439@7b5833ee

scala> add1
res14: (Int, Int) => Int = $$Lambda$1092/256869439@7b5833ee

scala> add1(1,1)
res15: Int = 2

scala> val a1 = add1
a1: (Int, Int) => Int = $$Lambda$1092/256869439@7b5833ee

scala> a1(2,2)
res16: Int = 4


// --------------------------------------------------------------------

scala> def add2(x:Int, y:Int) = x+y
add2: (x: Int, y: Int)Int


scala> add2(1,1)
res18: Int = 2

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

方法转化为函数

// 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数

语法:

val 变量 = 方法名 _

**例:**将方法转化为函数,赋值给变量

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Int

scala> val a = add _
a: (Int, Int) => Int = <function2>

字符串(String)

//定义字符串方式
	val S:String = "aaa"			//使用双引号
	val S:String = """aaaa"""		//使用三引号
	val S:String = s"${ 
          name}你好"	   //使用插值表达式
		//以s开头; name是个变量或者表达式

列出了 java.lang.String 常用方法

你可以在 Scala 中使用:

序号 方法及描述
1 **char charAt(int index)**返回指定位置的字符
2 **int compareTo(Object o)**比较字符串与对象
3 **int compareTo(String anotherString)**按字典顺序比较两个字符串
4 **int compareToIgnoreCase(String str)**按字典顺序比较两个字符串,不考虑大小写
5 **String concat(String str)**将指定字符串连接到此字符串的结尾
6 **boolean contentEquals(StringBuffer sb)**将此字符串与指定的 StringBuffer 比较。
7 **static String copyValueOf(char[] data)**返回指定数组中表示该字符序列的 String
8 **static String copyValueOf(char[] data, int offset, int count)**返回指定数组中表示该字符序列的 String
9 **boolean endsWith(String suffix)**测试此字符串是否以指定的后缀结束
10 **boolean equals(Object anObject)**将此字符串与指定的对象比较
11 **boolean equalsIgnoreCase(String anotherString)**将此 String 与另一个 String 比较,不考虑大小写
12 **byte getBytes()**使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
13 byte[] getBytes(String charsetName使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
14 **void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)**将字符从此字符串复制到目标字符数组
15 **int hashCode()**返回此字符串的哈希码
16 **int indexOf(int ch)**返回指定字符在此字符串中第一次出现处的索引
17 **int indexOf(int ch, int fromIndex)**返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索
18 **int indexOf(String str)**返回指定子字符串在此字符串中第一次出现处的索引
19 **int indexOf(String str, int fromIndex)**返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
20 **String intern()**返回字符串对象的规范化表示形式
21 **int lastIndexOf(int ch)**返回指定字符在此字符串中最后一次出现处的索引
22 **int lastIndexOf(int ch, int fromIndex)**返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索
23 **int lastIndexOf(String str)**返回指定子字符串在此字符串中最右边出现处的索引
24 **int lastIndexOf(String str, int fromIndex)**返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
25 **int length()**返回此字符串的长度
26 **boolean matches(String regex)**告知此字符串是否匹配给定的正则表达式
27 **boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)**测试两个字符串区域是否相等
28 **boolean regionMatches(int toffset, String other, int ooffset, int len)**测试两个字符串区域是否相等
29 **String replace(char oldChar, char newChar)**返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
30 String replaceAll(String regex, String replacement使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
31 **String replaceFirst(String regex, String replacement)**使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
32 **String[] split(String regex)**根据给定正则表达式的匹配拆分此字符串
33 **String[] split(String regex, int limit)**根据匹配给定的正则表达式来拆分此字符串
34 **boolean startsWith(String prefix)**测试此字符串是否以指定的前缀开始
35 **boolean startsWith(String prefix, int toffset)**测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
36 **CharSequence subSequence(int beginIndex, int endIndex)**返回一个新的字符序列,它是此序列的一个子序列
37 **String substring(int beginIndex)**返回一个新的字符串,它是此字符串的一个子字符串
38 **String substring(int beginIndex, int endIndex)**返回一个新字符串,它是此字符串的一个子字符串
39 **char[] toCharArray()**将此字符串转换为一个新的字符数组
40 **String toLowerCase()**使用默认语言环境的规则将此 String 中的所有字符都转换为小写
41 **String toLowerCase(Locale locale)**使用给定 Locale 的规则将此 String 中的所有字符都转换为小写
42 **String toString()**返回此对象本身(它已经是一个字符串!)
43 **String toUpperCase()**使用默认语言环境的规则将此 String 中的所有字符都转换为大写
44 **String toUpperCase(Locale locale)**使用给定 Locale 的规则将此 String 中的所有字符都转换为大写
45 **String trim()**删除指定字符串的首尾空白符
46 **static String valueOf(primitive data type x)**返回指定类型参数的字符串表示形式

补充:

S.head
S.drop(n)		
S.dropRight(n)	删除后面n个字符

字符串长度

str.length()

判断是字符串子字串

//判断str2在str1中的位置
str1.indexOf(str2)
返回-1说明 不存在

字符串拼接

val str3 = str1.concat(str2)
或者
val str3 = str1 + str2

替换

str1.replaceAll("字符串1","字符串2")	//将str1中 字符串1替换成字符串2

列表(List)

//列表是scala中最重要的、也是最常用的数据结构。List具备以下性质:
    - 可以保存重复的值
    - 有先后顺序
//有两种列表,一种是不可变列表、另一种是可变列表

不可变列表

//不可变列表就是列表的元素、长度都是不可变的。
//实际上元素,长度都是可以变的。 其实是可以改变的,例如:updated(), drop(), 
	准确的说“不可变列表  只是长度不可以增加”
定义语法
//使用`List(元素1, 元素2, 元素3, ...)`来创建一个不可变列表:
val/var 变量名 = List(元素1, 元素2, 元素3...)
	//例如 : var L = List(2,4,9,5,3,6,1,7,8)


//使用`Nil`创建一个不可变的空列表:
val/var 变量名 = Nil


//使用`::`方法创建一个不可变列表
val/var 变量名 = 元素1 :: 元素2 :: Nil
	//使用**::**拼接方式来创建列表,必须在最后添加一个**Nil**

**例:**创建一个不可变列表,存放以下几个元素(1,2,3,4)

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

**例:**使用Nil创建一个不可变的空列表

scala> val a = Nil
a: scala.collection.immutable.Nil.type = List()

**例:**使用::方法创建列表,包含-2、-1两个元素

scala> val a = -2 :: -1 :: Nil
a: List[Int] = List(-2, -1)
修改

将L(2) 替换成100

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJSCMo2i-1658546399397)(scala.assets/image-20211027170608831.png)]

删除

删除前5个数据 L(5)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8yKEQt1C-1658546399398)(scala.assets/image-20211027170859736.png)]

foreach()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ne3EDIS6-1658546399398)(scala.assets/image-20211027171140054.png)]

可变列表

//可变列表就是列表的元素、长度都是可变的。
//要使用可变列表,先要导入
	import scala.collection.mutable.ListBuffer
	//可变集合都在`mutable`包中
	//不可变集合都在`immutable`包中(默认导入)
定义语法
//使用ListBuffer[元素类型]()创建空的可变列表,语法结构:
	val/var 变量名 = ListBuffer[Int]()

//使用ListBuffer(元素1, 元素2, 元素3...)创建可变列表,语法结构:
	val/var 变量名 = ListBuffer(元素1,元素2,元素3...)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ScPkGe9-1658546399399)(scala.assets/image-20211029175647356.png)]

获取元素(使用括号访问(索引值)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qVAMuAAp-1658546399399)(scala.assets/image-20211029175846690.png)]

添加元素(+=

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUPqjn17-1658546399399)(scala.assets/image-20211029175938568.png)]

追加一个列表(++=

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXbURv9O-1658546399400)(scala.assets/image-20211029180022146.png)]

删除元素(-=

从左边起,删除第一个 特定元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQVH3g5A-1658546399408)(scala.assets/image-20211029180057127.png)]

更改元素(使用括号获取元素,然后进行赋值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3pe10Oa-1658546399409)(scala.assets/image-20211029180143001.png)]

转换为List(toList

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCqK1zEY-1658546399409)(scala.assets/image-20211029180230402.png)]

转换为Array(toArray

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S6Q1ophd-1658546

相关文章