scala学习手记37 - 容器的使用

编程爱好者联盟 2018-12-15

这次统一看一下scala中容器类的几个方法。

;

Set

;

filter()方法

;

filter()方法用来从Set中过滤获取含有指定特征的元素。示例代码如下:

;<pre>val ;colors1 ;= ;Set("Blue", ;"Green", ;"Red", ;"yellow")

val ;filteredSet ;= ;colors1 ;filter ;(_ ;contains ;"l")

println(filteredSet ;mkString ;",")</pre> ; ;

上面的代码从一个Set中过滤出了含有字符“l”的元素,而后调用mkString方法将过滤结果拼接打印出来。看一下结果:

scala学习手记37 - 容器的使用

; ;

++()方法

; ;

++()方法用来拼接两个Set。示例代码如下:

; ;<pre>val ;colors1 ;= ;Set("Blue", ;"Green", ;"Red", ;"yellow")

val ;colors2 ;= ;Set("White", ;"Black")

val ;combinedSet ;= ;colors1 ;++ ;colors2

println(combinedSet ;mkString ;",")</pre> ; ;

很简单的程序,看一下结果:

scala学习手记37 - 容器的使用

; ;

**()方法

; ;

**()方法用来找出两个Set的并集(教材上说的是交集,有误)。示例代码如下:

; ;<pre>val ;colors1 ;= ;Set("Blue", ;"Green", ;"Red", ;"yellow")

val ;colors2 ;= ;Set("White", ;"Black", ;"Red")

val ;uniondSet ;= ;colors1 ;++ ;colors2

println(unionSet ;mkString ;",")</pre> ; ;

执行结果:

scala学习手记37 - 容器的使用

; ;

map()方法

; ;

map()方法可以对Set的每个元素执行操作,最后返回的是一个新的集合。示例代码如下:

; ;<pre>val ;colors1 ;= ;Set("Blue", ;"Green", ;"Red", ;"yellow")

val ;colorSet ;= ;colors1 ;map ;("color ;is ;: ;" ;+ ;_)

colorSet ;foreach ;{

; ;println(_)

}</pre> ; ;

这里打印Set元素时使用了内置的迭代器foreach。执行结果:

scala学习手记37 - 容器的使用

; ;

Map

; ;

filterKeys()方法

; ;

filterKeys()方法用来对Map的key进行过滤,示例代码如下:

; ;<pre>val ;roster ;= ;Map("Jack" ;-&gt; ;"Solider", ;"Jane" ;-&gt; ;"Teacher")

val ;filteredMap ;= ;roster ;filterKeys ;(_ ;contains ;("Jac"))

println("Filtered ;Size ;: ;" ;+ ;filteredMap.size)</pre> ; ;

执行结果如下:

scala学习手记37 - 容器的使用

; ;

filter()方法

; ;

也可以使用filter()方法来执行过滤,不过filter()方法中的函数值操作的对象是Key-Value对。看一下代码:

; ;<pre>val ;roster ;= ;Map("Jack" ;-&gt; ;"Solider", ;"Jane" ;-&gt; ;"Teacher")

val ;filteredMap ;= ;roster ;filter ;{

; ;ele ;=&gt; ;val ;(k, ;v) ;= ;ele ;

; ; ; ;k ;contains ;("Jac")

}

println("Filtered ;Size ;: ;" ;+ ;filteredMap.size)</pre> ; ;

get()方法

; ;

get()方法用来从Map中取值,不过返回值的类型是Optional[T],示例代码如下:

; ;<pre>val ;roster ;= ;Map("Jack" ;-&gt; ;"Solider", ;"Jane" ;-&gt; ;"Teacher")

println("Jack" ;+ ; ;" ;is ;a ;" ;+ ;(roster ;get ;"Jack").get ;)</pre> ; ;

说实话,我不太喜欢Optional,还好scala不需要让我忍受这个东西,它还提供了另一种更简洁的获取kv对的方式:

; ;<pre>val ;roster ;= ;Map("Jack" ;-&gt; ;"Solider", ;"Jane" ;-&gt; ;"Teacher")

println("Jack" ;+ ; ;" ;is ;a ;" ;+ ;roster("Jack") ;)</pre> ; ;

在上面的代码里我们直接在Map对象后面使用了一个括号来取值。前面曾提到过,这是使用了Map的一个工厂方法apply。

; ;

update()方法

; ;

update()方法可以用来“更新”Map对象。因为我们用的Map是一个不变的类的对象,它的“更新”并不会影响之前的对象,它会返回一个新的对象。

; ;<pre>val ;roster ;= ;Map("Jack" ;-&gt; ;"Solider", ;"Jane" ;-&gt; ;"Teacher")

val ;updatedRoster ;= ;roster.updated("Jane", ;"Nurse")

println("Jane" ;+ ; ;" ;is ;a ;" ;+ ;roster("Jane") ;)

println("Jane" ;+ ; ;" ;is ;a ;" ;+ ;updatedRoster("Jane") ;)</pre> ; ;

执行结果如下:

scala学习手记37 - 容器的使用

; ;

List

; ;

在scala中Set和Map都有可变和不变两种实现,但是List只有不变的实现。scala中的List实现有些类似于java的LinkedList。scala的List的大部分操作都是围绕head和tail执行的。

如下是一个List使用的示例,我们要访问List示例的第一个元素可以使用list.head()方法也可以直接执行list(0):

; ;<pre>val ;list1 ;= ;List("Red", ;"Yellow", ;"Blue")

println(list1.head)

println(list1(0))</pre> ; ;

执行结果是:

scala学习手记37 - 容器的使用

; ;

::()方法

; ;

这个方法用于在List前添加元素。a ;:: ;list可以读作“在List前添加a”。示例代码如下:

; ;<pre>val ;list1 ;= ;List("Red", ;"Yellow", ;"Blue")

val ;list2 ;= ;"Black"::list1

println(list1.mkString(","))

println(list2.mkString(","))</pre> ; ;

执行结果如下:

scala学习手记37 - 容器的使用

; ;

:::()方法

; ;

这个方法用于将一个List实例添加到另一个List实例前面。list ;::: ;listA可以读作“在listA前添加list”。示例代码如下:

; ;<pre>val ;list1 ;= ;List("Red", ;"Yellow", ;"Blue")

val ;list2 ;= ;"Black"::list1

val ;combinedList ;= ;list2:::list1

println(list1.mkString(","))

println(list2.mkString(","))

println(combinedList.mkString(","))</pre> ; ;

执行结果如下:

scala学习手记37 - 容器的使用

请注意:以上两个List的方法操作对象都是操作符后的List实例。

; ;

forall()和exists()

; ;

用forall()方法可以检查是否所有元素都满足某一特定条件。而想了解是否存在某些元素满足特定条件,可以用exists()。示例代码如下:

; ;<pre>val ;list1 ;= ;List("Red", ;"Yellow", ;"Blue")

println(list1 ;forall ;(_ ;contains ;("R")))

println(list1 ;exists ;(_ ;contains ;("R")))</pre> ; ;

执行结果如下:

scala学习手记37 - 容器的使用

此外还有map()方法、foldLeft()、foldRight()方法等,前面也都提到过。今天我不想再继续了。

就这样!

########

相关推荐