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
filter
method 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
filter
method returns a sequence ofPerson
objects where the last name is "Flintstone". - The
map
method call gets the first name of eachPerson
object. This results in a sequence of strings, where each string is the first name of each person that came out of thefilter
call.
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:
filter
implicitly loops over aList
.filter
takes a function as an argument. That function should take oneList
element as input, perform the test you define, and then return either true or false (aBoolean
).filter
only returnsList
elements 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模块也是一个插件,开发 ...
随机推荐
- Linux系统Domino704升级为901 64位的步骤及注意事项
[背景] 随便系统业务量的不断增大,应用数据库越来越多.与第三方接口的需求越来越多.文档量越来越多,32位的domino对server的利用率已无法满足系统需求的日益增长,低版本号的domino ...
- oracel become INDEX UNUSABLE
1. IMPORT PARTITION or conventional path SQL*Loader. 2. Direct-path SQL*Loader leaves affected local ...
- 纯jascript解决手机端拍照、选图后图片被旋转问题
需要的js1 需要的js2 这里主要用到Orientation属性. Orientation属性说明如下: 旋转角度 参数 0° 1 顺时针90° 6 逆时针90° 8 180° 3 <!DOC ...
- eclipse JRE(unbound)问题
eclipse eclipse eclipse eclipse eclipse JRE(unbound) createTime--2016年10月18日14:18:59 Author:Mary ...
- Apache Hadoop 3.0新版本介绍及未来发展方向
过去十年,Apache Hadoop从无到有,从理论概念演变到如今支撑起若干全球最大的生产集群.接下来的十年,Hadoop将继续壮大,并发展支撑新一轮的更大规模.高效和稳定的集群. 我们此次将向大家全 ...
- 【微信小程序】:confirm(删除提示)
微信小程序删除处理 没有 confrim 那怎么实现这个效果呢 可以使用小程序里的模态框 代码: wxml: <a class="reply" wx:if="{{c ...
- Fork me on GitHub
<a href="https://github.com/yadongliang"><img style="position: absolute; top ...
- invalid configuration x86_64-unknown-linux-gnu' machine x86_64-unknown' not recognized
转载自:http://blog.csdn.net/php_boy/article/details/7382998 前两天在装机器软件的时候, 出现了下面的错误, invalid configurati ...
- python学习笔记011——函数式编程
1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...
- errno之我见
Errno能帮我们找到系统函数的错误信息. 比方open函数,假设正常返回时,其返回值是一个非负的整数. 异常时会返回-1.同一时候该系统函数会设置errno的值.让我们能够了解错误的原因. Errn ...