`

Scala filter方法过滤集合元素(获取集合中的元素)

 
阅读更多
Problem

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

Solution

“选择一个集合方法来解决问题”,大量的方法可以被用来过滤输入集合的元素然后生成新的集合。这一节中展示了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

在这里我们再来看一看都有什么: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的两个关键点是:

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

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

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    bloom-filter-scala, 用于 Scala的Bloom过滤器,最快的JVM.zip

    bloom-filter-scala, 用于 Scala的Bloom过滤器,最快的JVM Scala的 Bloom filter 概述Bloom过滤器是一种空间高效的数据结构,用于测试某个元素是否是集合的成员。 false 正匹配是可能的,但 false 负数不是。 ...

    scala + mybatis 数据库查询

    - 使用Scala的惰性计算和集合优化,可以在不影响代码可读性的情况下提高性能。 通过以上步骤,我们可以高效地利用Scala和MyBatis实现数据库查询。这种结合不仅保持了Scala的优雅和强大,还充分利用了MyBatis的便利...

    bloom-filter-scala:Scala的Bloom过滤器,对于JVM最快

    ”可以将元素添加到集合中,但不能删除。”说。 简而言之,什么是Bloom过滤器: 优化内存。 当您无法将整个设备放入内存时,它就会发挥作用。 解决会员问题。 它可以回答一个问题:元素是否属于集合? 概率...

    scala语言pdf_带目录标签

    读者可以学习到如何使用映射(map)、过滤(filter)、折叠(fold)等函数,以及如何自定义集合操作。 总的来说,这四本书籍构建了一个完整的Scala学习体系,从基础知识到高级特性的实践,再到特定领域如函数式编程...

    scala 案例

    4. **集合API**:Scala的集合库非常强大,提供了丰富的操作,如转换、过滤和并行处理。它还支持`Option`类型来处理可能的null值,减少空指针异常。 5. **模式匹配**:Scala的模式匹配允许解构复杂数据结构,如`case...

    scala从入门到进阶

    - **flatMap、map和filter**:这些函数是函数式编程中的核心操作,用于转换和过滤集合。 3. **面向对象编程(OOP)** - **特质(Trait)**:Scala的特质提供了一种实现多继承和代码复用的方式,可以被类混合入。 ...

    Scala编程思想

    这些集合不仅支持传统的操作,还提供了函数式编程中的转换和过滤等功能,使得处理数据变得简单而高效。 6. ** Trait与Mixins**:Scala的Trait允许定义行为片段,可以被多个类混合(mixin)使用,从而实现了代码复用...

    scala relation bao

    例如,`map`函数用于对集合中的每个元素应用一个函数并返回新集合;`filter`用于根据条件筛选元素;`reduce`或`fold`用于将所有元素组合成单一值;`groupBy`则可以按照指定条件对数据进行分组。 2. **模式匹配**:...

    scala版DVD管理系统

    1. **类与对象**:Scala中的类是创建对象的基础,可能定义了一个`DVD`类,包含了`title`(标题)、`director`(导演)、`releaseYear`(发行年份)等属性,以及`borrow`(外借)和`return`(归还)等方法,用于管理...

    Spark常用的算子以及Scala函数总结.pdf

    除了上述的算子外,Scala 本身还提供许多强大的函数式编程特性,比如高阶函数、集合操作、模式匹配等,这些特性在 Spark 编程中也能得到充分利用。在学习 Spark 编程时,熟悉这些算子和 Scala 的函数式编程特性是...

    scala 操作RDD的代码分析实例

    * 作为占位符:在集合中的每一个元素,可以使用下划线作为占位符,例如 `val list=List(1,2,3,4) val list1=list.map(_ * 10)` * 获取元组中的元素:在元组中,可以使用下划线来获取具体的元素,例如 `val t=(...

    scala实现朴素贝叶斯算法

    在Scala中实现这些步骤,我们可以利用集合操作和函数式编程的优势。例如,`Map`类型可以用来存储类别及其对应的先验概率和条件概率;`fold`或`reduce`等函数可以用于计算频率;`filter`和`map`可用于预处理数据。 ...

    Scala样例类练习.docx

    使用`Option`类型处理可能存在的值或不存在的值的情况,`getOrElse`方法用于获取值或提供默认值。 #### 十三、处理除法运算的异常 ```scala object Demo13 { def divide(numerator: Int, denominator: Int): ...

    Scala 【 5 数组常见操作和 Map 】

    在 Scala 中,数组和 Map 是两种非常常用的数据结构。数组用于存储同类型的固定大小的数据集合,而 Map 则用于存储键值对。接下来,我们将详细探讨数组的常见操作以及 Map 的使用方法。 **数组操作** 1. **创建...

    scala PPt

    在Scala编程语言中,操作符实际上都是方法,这是Scala的一个重要基础概念。例如,当我们写1 + 2时,这并不是一个特殊的语法结构,而是调用了1对象的+.方法,等同于1.+ (2)。如果在1后面直接跟一个点(1.),它会被...

    Scala学习技术教程

    为了更好地管理这些集合,Scala提供了一系列操作,如map、flatMap、filter等,这些操作使得对集合的操作更加简洁和直观。通过这些操作,开发者可以方便地进行数据过滤、转换以及组合操作。 并发编程是现代编程中不...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    在大数据分析中,Scala的集合API是一大亮点,它提供了丰富的操作,如map、filter和reduce,这些在处理大规模数据时非常实用。 接下来是Apache Spark。Spark以其内存计算模型著称,极大地提高了数据处理速度,比传统...

    布隆过滤器+CBF scala实现+代码详解

    【布隆过滤器(Bloom Filter)】是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中。它可能会误报一个元素在集合中(假阳性),但不会漏报(假阴性)。布隆过滤器的核心在于一个位数组和多个独立...

    Scala\scala-2.9.1.final-devel-docs.zip

    5. **特质(Trait)**:Scala的特质提供了类似于接口的功能,但允许包含抽象方法的实现,可以用来实现多重继承或作为行为的组合单元。 6. **模式匹配**:Scala的模式匹配功能强大,支持对数据结构进行解构,以及在`...

Global site tag (gtag.js) - Google Analytics