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

Set

filter()方法

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

val colors1 = Set("Blue", "Green", "Red", "yellow")
val filteredSet = colors1 filter (_ contains "l")
println(filteredSet mkString ",")

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

++()方法

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

val colors1 = Set("Blue", "Green", "Red", "yellow")
val colors2 = Set("White", "Black") val combinedSet = colors1 ++ colors2
println(combinedSet mkString ",")

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

**()方法

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

val colors1 = Set("Blue", "Green", "Red", "yellow")
val colors2 = Set("White", "Black", "Red") val uniondSet = colors1 ++ colors2
println(unionSet mkString ",")

执行结果:

map()方法

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

val colors1 = Set("Blue", "Green", "Red", "yellow")

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

colorSet foreach {
println(_)
}

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

Map

filterKeys()方法

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

val roster = Map("Jack" -> "Solider", "Jane" -> "Teacher")
val filteredMap = roster filterKeys (_ contains ("Jac"))
println("Filtered Size : " + filteredMap.size)

执行结果如下:

filter()方法

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

val roster = Map("Jack" -> "Solider", "Jane" -> "Teacher")
val filteredMap = roster filter {
ele => val (k, v) = ele
k contains ("Jac")
}
println("Filtered Size : " + filteredMap.size)

get()方法

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

val roster = Map("Jack" -> "Solider", "Jane" -> "Teacher")
println("Jack" + " is a " + (roster get "Jack").get )

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

val roster = Map("Jack" -> "Solider", "Jane" -> "Teacher")
println("Jack" + " is a " + roster("Jack") )

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

update()方法

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

val roster = Map("Jack" -> "Solider", "Jane" -> "Teacher")
val updatedRoster = roster.updated("Jane", "Nurse")
println("Jane" + " is a " + roster("Jane") )
println("Jane" + " is a " + updatedRoster("Jane") )

执行结果如下:

List

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

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

val list1 = List("Red", "Yellow", "Blue")
println(list1.head)
println(list1(0))

执行结果是:

::()方法

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

val list1 = List("Red", "Yellow", "Blue")
val list2 = "Black"::list1
println(list1.mkString(","))
println(list2.mkString(","))

执行结果如下:

:::()方法

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

val list1 = List("Red", "Yellow", "Blue")
val list2 = "Black"::list1
val combinedList = list2:::list1
println(list1.mkString(","))
println(list2.mkString(","))
println(combinedList.mkString(","))

执行结果如下:

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

forall()和exists()

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

val list1 = List("Red", "Yellow", "Blue")
println(list1 forall (_ contains ("R")))
println(list1 exists (_ contains ("R")))

执行结果如下:

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

就这样!

########

scala学习手记37 - 容器的使用的更多相关文章

  1. scala学习手记36 - 容器基础

    scala的容器包括Set.List和Map.三种容器的特征和Java中一样.scala为每种容器都提供了可变和不可变两种版本,分别位于scala.collection.mutable或scala.c ...

  2. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  3. scala学习手记38 - 方法命名约定和for表达式

    方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...

  4. scala学习手记23 - 函数值

    scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...

  5. scala学习手记8 - 自适应的默认做法

    scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...

  6. Scala学习手记1 - 快速体验

    又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...

  7. scala学习手记40 - 使用case类

    前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match ...

  8. scala学习手记40 - case表达式里的模式变量和常量

    再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...

  9. scala学习手记39 - 模式匹配

    在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...

随机推荐

  1. Windows(7)上那些好用的软件及优化技巧(原创)

    *本文为原创内容,转载请注明作者和出处:www.cnblogs.com/wang1024 软件篇 注:以下软件在百度直接搜索软件名均可找到官网,直接官网下载即可 大众的软件哪个好: 杀毒软件专题 基于 ...

  2. 【IDEA】单元测试:项目中引入JUnit测试框架+Mock简单了解

    一.Junit 使用和说明: 参考:单元测试第三弹--使用JUnit进行单元测试-HollisChuang's Blog http://www.hollischuang.com/archives/17 ...

  3. 【Double】double精度问题和int、long除不尽取舍问题

    看了老半天,真心没搞懂,留下几篇文章,后面继续跟进吧.... 一.如何理解double精度丢失问题? - 知乎 https://www.zhihu.com/question/42024389/answ ...

  4. phantomjs学习之截图

    1.创建pageload.js文件: pageload.js var page = require('webpage').create(); var address = 'https://www.ba ...

  5. 基于kubernetes集群的Vitess最佳实践

    概要 本文主要说明基于kubernetes集群部署并使用Vitess; 本文假定用户已经具备了kubernetes集群使用环境,如果不具备请先参阅基于minikube的kubernetes集群搭建, ...

  6. 转!!CSRF攻击与防御(写得非常好)

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:       攻击者盗用了你的身份,以你的名义发送恶 ...

  7. 转!!java泛型

    介绍java泛型的一篇文章,通俗易懂! 原文地址:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html 一. 泛型概念的提出(为什么需要泛型)? 首先,我 ...

  8. mysql大数据查询优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. 两款高性能并行计算引擎Storm和Spark比較

    对Spark.Storm以及Spark Streaming引擎的简明扼要.深入浅出的比較,原文发表于踏得网. Spark基于这种理念.当数据庞大时,把计算过程传递给数据要比把数据传递给计算过程要更富效 ...

  10. Swap 2 Variables in Python

    In Python, it's concise, easy and faster to swap 2 variables compared in other Programming languages ...