文档章节

第十章 Scala 容器基础(十七):使用filter方法过滤集合元素

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/04/13 15:07
字数 922
阅读 6308
收藏 2

Problem

    你想要筛选出集合中的一些元素形成一个新的集合,这些元素都是满足你的筛选条件的。

Solution

    在10.3节中,“选择一个集合方法来解决问题”,大量的方法可以被用来过滤输入集合的元素然后生成新的集合。这一节中展示了filter方法。那么如何正确使用集合的filter方法呢,首先你需要给filter方法一个判断条件或者返回true/false的函数,这个判断条件(函数)的输入类型要与集合元素类型一致,返回值是布尔型的。filter方法会对集合的每一个元素调用判断条件,当条件为true的时候则元素进入新的集合否则会被过滤掉。你还需要使用一个变量来指向新的集合。

    下面这个例子展示了,如何通过取模算法从一个输入集合中筛选出偶数并形成一个新的集合:

scala> val x = List.range(1, 10)
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> val evens = x.filter(_ % 2 == 0)
evens: List[Int] = List(2, 4, 6, 8)

    正如上面展示的,filter方法返回了所有使假设条件(_ % 2 == 0)为真的集合元素组成的新集合。还有一个方法filterNot,可以返回所有使假设条件返回false的元素组成的新集合。

scala> val evens = x.filterNot(_ % 2 == 0)
evens: List[Int] = List(1, 3, 5, 7, 9)

Discussion

    你可以使用的用来过滤集合主要方法已经在10.3节展示过了,在这里我们再来看一看都有什么:collect、diff、distinct、frop、dropWhile、filter、filterNot、find、foldLeft、foldRight、head、headOption、init、intersect、last、lastOption、reduceLeft、reduceRight、remove、slice、tail、take、takeWhile、union。

    filter方法对比其他方法的特点有:

  • filter方法遍历整个集合,其他的方法都只是遍历一部分元素

  • filter方法允许你提供一个判断条件(函数),来过滤集合元素

    如何筛选集合元素完全取决于你的算法,接下来的例子展示了一些方法来过滤字符串列表:

scala> val fruits = Set("orange", "peach", "apple", "banana")
fruits: scala.collection.immutable.Set[String] = Set(orange, peach, apple, banana)

scala> val x = fruits.filter(_.startsWith("a"))
x: scala.collection.immutable.Set[String] = Set(apple)

scala> val x = fruits.filter(_.length > 5)
x: scala.collection.immutable.Set[String] = Set(orange, banana)

    当你的判断逻辑复杂,没有办法一行写完,我们可以在filter内部使用多行的判断逻辑:

scala> val list = "apple" :: "banana" :: 1 :: 2 :: Nil
list: List[Any] = List(apple, banana, 1, 2)

scala> val strings = list.filter{
     |   case s:String => true
     |   case _ => false
     | }
strings: List[Any] = List(apple, banana)

    你同样可以定义一个判断函数,然后把这个函数传给filter方法:

def onlyStrings(a: Any) = a match {
  case s: String => true
  case _ => false
}

scala> val strings = list.filter(onlyStrings)
strings: List[Any] = List(apple, banana)

    接下来的这个例子告诉你,你可以多次连续调用filter方法:

def getFileContentsWithoutBlanksComments(canonicalFilename: String):
List[String] = {
  io.Source.fromFile(canonicalFilename)
    .getLines
    .toList
    .filter(_.trim != "")
    .filter(_.charAt(0) != '#')
}

    我们在一个文件中读取所有的行,转换为一个List,每行是一个元素,然后我们把空行过滤掉,然后再把#开头的过滤掉。看起来是一个统计shell脚本代码行数的算法。

    使用filter的两个关键点是:

  • 你的算法需要能正确判断出你所需要的元素,并返回true,对于你不需要的数据则返回false

  • 记得用一个新的变量指向filter方法返回的集合,因为filter方法并不会对原集合做改变

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
第十章 Scala 容器基础(七):用Vector作为你指定的不可变序列

问题: 你需要为你的Scala应用选择一个快速,通用的不可变序列集合类型,那么该如何选择呢? 解决: Vecotr类目前可以被认为是这么一个通用的不可变数据结构。Vector是一个带索引的不可变序列...

阿拉德大陆的魔法师
2016/04/10
1K
0
第十章 Scala 容器基础(二十四):给集合创建一个懒加载视图

Problem 你正在使用一个巨大的集合,并且想创建一个懒加载的版本。只有在计算或者返回结果时才真正被调用。 Solution 除了Stream类,不论什么时候你创建一个Scala集合类的实例,你都创建了一...

阿拉德大陆的魔法师
2016/04/18
175
0
第十章 Scala 容器(三):使用容器通用方法解决问题

综述 Scala的容器类主要提供了下面这些方法来使用它它们:1. 过滤;2. 遍历;3. 分区; 4. 数学统计;5. 其他。我们来详细看看这些方法 2. 容器通用方法(Common methods on Traversable col...

阿拉德大陆的魔法师
2016/04/03
532
0
第十章 Scala 容器基础(十四):使用map把一个集合转化为另一个

Problem 像上一节一样,你想把一个集合的每个元素通过某种算法变换后生成一个新的集合 Solution 我们要调用集合的map方法,然后传给它一个函数、匿名函数或者方法来对每一个集合元素进行变换...

阿拉德大陆的魔法师
2016/04/12
318
0
第十章 Scala 容器基础(十):使用for循环来遍历一个集合

Problem 我想使用for循环来遍历容器的所有元素,或者通过for yield来创建一个新的集合。 Solution 你可以使用for循环遍历所有的Traversable类型(基本上所有的sequency都可以): scala> val f...

阿拉德大陆的魔法师
2016/04/10
621
0

没有更多内容

加载失败,请刷新页面

加载更多

如何有效地计算JavaScript中对象的键/属性数量?

计算对象的键/属性数的最快方法是什么? 是否可以在不迭代对象的情况下执行此操作? 即不做 var count = 0;for (k in myobj) if (myobj.hasOwnProperty(k)) count++; (Firefox确实提供了一...

技术盛宴
23分钟前
3
0
百度网址安全中心拦截解除的办法分享

临近2019年底,客户的公司网站被百度网址安全中心拦截了,公司网站彻底打不开了,影响范围很大,于是通过朋友介绍找到我们SINE安全公司寻求帮忙解封,关于如何解除百度的安全拦截提示,下面就...

网站安全
34分钟前
3
0
Tomcat8源码分析-启动流程-start方法

上一篇:Tomcat8源码分析-启动流程-load方法 前面讲了启动流程中的Catalina.load,进一步调用绝大部分组建的init操作,主要完成对server.xml解析,并根据解析的结果结合设置的Rule(规则)构造...

特拉仔
43分钟前
6
0
Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍

Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍 轻拍标签栏中的About标签,进入关于页面,如图1.8和图1.9所示。它是对应用程序介绍的页面。 该页面源自Views文件夹中的AboutPage.x...

大学霸
49分钟前
3
0
一步一步理解Impala query profile(一)

很多Impala用户不知道如何阅读Impala query profile来了解一个查询背后正在执行的操作,从而在此基础上对查询进行调优以充分发挥查询的性能。因此我想写一篇简单的文章来分享我的经验,并希望...

九州暮云
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部