Filter method example
The Scala List class filter method implicitly loops over the List/Seq you supply, tests each element of the List with the function you supply. Your function must return true or false, and filter returns the list elements where your function returns true.
Note: Even though I use a List in these examples, the
filtermethod can be used on any Scalasequence, includingArray,ArrayBuffer,List,Vector,Seq, etc.
Let's look at a few simple examples. In this first example we filter a small list of numbers so that our resulting list only has numbers that are greater than 2:
scala> val nums = List(5, 1, 4, 3, 2)
nums: List[Int] = List(5, 1, 4, 3, 2) scala> nums.filter(_ > 2)
res0: List[Int] = List(5, 4, 3)
Note that in the real world you'd assign the filtered results to a new List, like this:
val originalList = List(5, 1, 4, 3, 2)
val newList = originalList.filter(_ > 2)
This example shows how to get the even numbers from a List using a simple modulus test:
scala> nums.filter(_ % 2 == 0)
res21: List[Int] = List(4, 2)
You can take that example a step further by filtering and then sorting the list:
scala> nums.filter(_ % 2 == 0).sort(_ < _)
warning: there were 1 deprecation warnings; re-run with -deprecation for details
res22: List[Int] = List(2, 4)
1) filter method examples with a List of Strings
Here are two filter method examples with a list of Strings:
val fruits = List("orange", "peach", "apple", "banana")
scala> fruits.filter(_.length > 5)
res21: List[java.lang.String] = List(banana, orange)
scala> fruits.filter(_.startsWith("a"))
res22: List[java.lang.String] = List(apple)
2) Combining filter, sort, and map
From the excellent book, Beginning Scala, here's a nice combination of theList filter, sort, and map methods:
trait Person {
def first: String
def age: Int
def valid: Boolean
}
Returns the first name of 'valid' persons, sorted by age
def validByAge(in: List[Person]) =
in.filter(_.valid).
sort(_.age < _.age).
map(_.first)
The following example shows how you can use filter with map to transform the type of data that the expression returns. In this case we'll start with a sequence of Person objects, and transform it into a sequence ofString objects.
We'll start with a simple case class:
scala> case class Person(first: String, last: String, mi: String)
defined class Person
Next, we'll create a little sequence of Person objects:
scala> val fred = Person("Fred", "Flintstone", "J")
fred: Person = Person(Fred,Flintstone,J)
scala> val wilma = Person("Wilma", "Flintstone", "A")
wilma: Person = Person(Wilma,Flintstone,A)
scala> val barney = Person("Barney", "Rubble", "J")
barney: Person = Person(Barney,Rubble,J)
scala> val betty = Person("Betty", "Rubble", "A")
betty: Person = Person(Betty,Rubble,A)
scala> val peeps = Seq(fred, wilma, barney, betty)
peeps: Seq[Person] = List(Person(Fred,Flintstone,J), Person(Wilma,Flintstone,A), Person(Barney,Rubble,J), Person(Betty,Rubble,A))
Finally, we'll combine filter and map to get a list of all first names where the last name is "Flintstone":
scala> peeps.filter(_.last == "Flintstone").map(_.first)
res0: Seq[String] = List(Fred, Wilma)
The way this works is:
- The
filtermethod returns a sequence ofPersonobjects where the last name is "Flintstone". - The
mapmethod call gets the first name of eachPersonobject. This results in a sequence of strings, where each string is the first name of each person that came out of thefiltercall.
I initially wrote this as a for/yield loop, but then realized I could write this much more concisely with this approach. At the moment I find the for/yield loop to be more readable, and this to be much more concise.
In my opinion, this code can be made a little more readable by using a variable name in the map expression, as a reminder that you're still dealing with Person objects:
scala> peeps.filter(_.last == "Flintstone").map(person => person.first)
res1: Seq[String] = List(Fred, Wilma)
3) Scala List filter method summary
I hope these filter method examples have been helpful. Here's a quick summary of how the filter method works:
filterimplicitly loops over aList.filtertakes a function as an argument. That function should take oneListelement as input, perform the test you define, and then return either true or false (aBoolean).filteronly returnsListelements that match the filtering expression.
Filter method example的更多相关文章
- [Javascript] The Array filter method
One very common operation in programming is to iterate through an Array's contents, apply a test fun ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- Swift map filter reduce 使用指南
转载:https://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/ Using map, filter or reduce to ope ...
- [译]Javascript数列filter方法
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- java性能调优及问题追踪--Btrace的使用
在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方式,在不修改 ...
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- SQLAlchemy query with OR/AND/like common filters
http://www.leeladharan.com/sqlalchemy-query-with-or-and-like-common-filters Some of the most common ...
- dojo/query源码解析
dojo/query模块是dojo为开发者提供的dom查询接口.该模块的输出对象是一个使用css选择符来查询dom元素并返回NodeList对象的函数.同时,dojo/query模块也是一个插件,开发 ...
随机推荐
- windows命令:control命令
Windows的命令列模式下有个非常好用的命令叫做Control.这个命令其实就是控制『控制台』的一个接口.你可以用这个命令直接叫起一些平常要找很久才会找到的窗口.最简单的一个例子,你只要在『开始』 ...
- eclipse 配置多个jdk(jre)
eclipse 配置多个jdk(jre) CreateTime--2018年4月24日08:57:40 Author:Marydon 1.打开设置窗口 输入jre 2.点击"Add... ...
- TOMCAT问题总结
迁移时间--2017年7月9日14:58:12Author:Marydon CreateTime--2016年12月25日21:55:09Author:MarydonTomcat问题总结问题一 A ...
- 【Linux】war包的解压与压缩
现在存在一个war包test.war(以下是在Linux上操作) 1.解压war包 jar –xvf test.war 说明:直接解压到当前文件夹,如果需要解压到指定的文件夹下,需要将test.war ...
- webservice系统学习笔记4-使用工具查看SOAP消息
使用myeclipse的WTP java ee视图里的[web services Explorer]来测试查看webservice传输的SOAP消息 1. 2. 测试getUserByUsername ...
- 使用JDK自带的Stax操作XML
操作的books.xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> < ...
- RabbitMQ消息队列生产者和消费者
概述 生产者生产数据至 RabbitMQ 队列,消费者消费 RabbitMQ 队列里的数据. 详细 代码下载:http://www.demodashi.com/demo/10723.html 一.准备 ...
- 个人网站不输入www.直接domain.com访问不了,输入www.domain.com能访问
网站访问跳转到/cgi-sys/defaultwebpage.cgi页面原因之一ip地址不对解决后,www.domain.com是可以访问了.但是直接domain.com去不能? 我记得刚开始 ...
- Java虚拟机学习 - 对象内存分配与回收 ( 5 )
对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...
- web.csproj Compile 下出现两个同名 xxx.cs 项目中出现两个xxx.cs
删掉一个就好了 ItemGroup Compile 为加载的cs代码文件