Scala Learning(2): map, flatMap, filter与For表达式

本文叙述Collections里最常见的三种操作map, flatMap, filter,与For表达式的关系。

List对三种方法的实现

map在List的实现:

abstract class List[+T] {
  def map[U](f: T => U): List[U] = this match {
    case x :: xs => f(x) :: xs.map(f)
    case Nil => Nil
  }
}

flatMap在List的实现:

abstract class List[+T] {
  def flatMap[U](f: T => List[U]): List[U] = this match {
    case x :: xs => f(x) ++ xs.flatMap(f)
    case Nil => Nil
  }
}

filter在List的实现:

abstract class List[+T] {
  def filter(p: T => Boolean): List[T] = this match {
    case x :: xs =>
      if (p(x)) x :: xs.filter(p) else xs.filter(p)
    case Nil => Nil
  }
}

For表达式

下面这段逻辑,可以在for里简单表达:

(1 until n) flatMap (i =>
  (1 until i) filter (j => isPrime(i + j)) map
    (j => (i, j)))
for {
  i <- 1 until n
  j <- 1 until i
  if isPrime(i + j)
} yield (i, j)

for与map

for (x <- e1) yield e2

// translated to
e1.map(x => e2)

for与filter

for (x <- e1 if f; s) yield e2

// translated to
for (x <- e1.withFilter(x => f); s) yield e2

for与flatMap

for (x <- e1; y <- e2; s) yield e3

// translated to
e1.flatMap(x => for (y <- e2; s) yield e3)

for与Pattern Matching

结合前一篇文章(JSON表达)的例子,用for来做map、filter的操作:

val data: List[JSON] = ...
for {
  JObj(bindings) <- data
  JSeq(phones) = bindings("phoneNumbers")
  JObj(phone) <- phones
  JStr(digits) = phone("number")
  if digits startsWith "212"
} yield (bindings("firstName"), bindings("lastName"))

for里面Pattern Matching的大致翻译过程:

pat <- expr
// to
x <- expr withFilter {
    case pat => true
    case _ => false
  } map {
    case pat => x
  }

Exercise

for {
  x <- 2 to N
  y <- 2 to x
  if (x % y == 0)
} yield (x, y)

可以翻译为:

(2 to N) flatMap (x =>
  (2 to x) withFilter (y =>
    x % y == 0) map (y => (x, y)))

参考自 Principles of Reactive Programming

全文完 :)

时间: 2024-10-06 07:26:23

Scala Learning(2): map, flatMap, filter与For表达式的相关文章

在java中如何获取或初始化scala.collection.immutable.Map?

问题描述 在java中如何获取或初始化scala.collection.immutable.Map? java调用kafka API时需要一个一个scala.collection.immutable.Map参数,但不知道如何初始化或通过其他API获取 解决方案 java.util.Map javaMap = new java.util.HashMap();scala.collection.immutable.Map scalaImmutableMap = scala.collection.Jav

Scala Learning(1): 使用Pattern Matching表达JSON

这是一个挺能展现Scala编程方式的例子,对正在熟悉Scala这门语言的开发者很有帮助. Representing JSON 用Scala来表达JSON(Java Script Object Notation)结构, { "firstname" : "John", "lastname" : "Smith", "address" : { "street" : "21 2nd St

王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()

转载请注明出处:王亟亟的大牛之路 首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!! 本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈) 今天上的是关于Python的文章,毕竟在亲戚家拜年,懒得插各类手机调试什么的,况且确实好久没有弄Python了,就写了,废话不多,开始正题!! 函数式编程 函数是什么? 把复杂的操作化为简单的函数分解成简单的操作,这种操作就是面向过程,也就是C这类的实现的大体概念. 函数式是什么? 函数没有变量,任意一个函数,只要输入

Scala Learning(3): Tail Recursion定义

关于尾递归 ,使用Scala的两个例子展示尾递归的定义和简单实现. 例子比较 求最大公约数的函数 def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) 计算的展开是尾递归的, gcd(14, 21) -> if (21 == 0) 14 else gcd(21, 14 % 21) -> if (false) 14 else gcd(21, 14 % 21) -> gcd(21, 14 % 21) -> gcd

Scala Learning(4): Currying柯里化的推演

本文展示加法和乘法的两个例子,最后使用MapReduce的思想把两者统一成一个带Currying的表达形式. 从high-order functions推演到Currying 原始方法 def sum(f: Int => Int, a: Int, b: Int): Int = if (a > b) 0 else f(a) + sum(f, a + 1, b) 表示从a到b,把每个int做一次f处理,把所有结果累加起来. 对应"加法"."立方"."

Scala学习笔记

1类型自动匹配(模式匹配) 2函数是有值的(匿名函数是函数的常态) 递归函数需要指定返回值 3.内部类隶属于外部类的实例本身,而java内部类属于外部类,对外部类的依赖路径依赖 4.object类似于java中的静态内部类 里面的所有成员都是静态的,适用于配置文件 静态都是用来修饰类的内部成员的.比如静态方法.静态成员变量.它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得.这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得. 5.同

高可用Hadoop平台-探索

1.概述 上篇<高可用Hadoop平台-启航>博客已经让我们初步了解了Hadoop平台:接下来,我们对Hadoop做进一步的探索,一步一步的揭开Hadoop的神秘面纱.下面,我们开始赘述今天的探索之路. 2.探索 在探索之前,我们来看一下Hadoop解决了什么问题,Hadoop就是解决了大数据(大到单台服务器无法进行存储,单台服务器无法在限定的时间内进行处理)的可靠存储和处理. HDFS:在由普通或廉价的服务器(或PC)组成的集群上提供高可用的文件存储,通过将块保存多个副本的办法解决服务器或硬

Apache Flink数据流的Fault Tolerance机制

简介 Apache Flink提供了一个失败恢复机制来使得数据流应用可以持续得恢复状态.这个机制可以保证即使线上环境的失败,程序的状态也将能保证数据流达到exactly once的一致性.注意这里也可以选择降级到保证at least once的一致性级别. 失败恢复机制持续地构建分布式流式数据的快照.对于那些只有少量状态的流处理应用,这些快照都是非常轻量级的并且可以以非常频繁的频率来构建快照而不需要太多地考虑性能问题.而流应用的状态被存储在一个可配置的持久化存储(比如master节点或者HDFS

Python的filter, map, reduce和zip等内置序列函数

filter, map, reduce, zip都是针对python中的sequence数据类型的内置方法. 名词解释:本文中的iterable是指可迭代对象,包括sequence和iterator,及其他具有可迭代性的container. 1. filter(function, iterable) filter的工作原理是使用第一个参数对象(function或者None)来对第二参数对象iterable进行运算,并根据运算结 果的布尔值来过滤iterable中的元素. 对function返回值