Scala系列8:函数式编程之map,flatten,flatmap的使用详解

0.Scala函数式编程

我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。注意这些函数都是操作 Scala 集合的,一般会进行两类操作:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。

  1. 遍历( foreach )
  2. 映射( map )
  3. 映射扁平化( flatmap )
  4. 过滤( filter )
  5. 是否存在( exists )
  6. 排序( sorted 、 sortBy 、 sortWith )
  7. 分组( groupBy )
  8. 聚合计算( reduce )
  9. 折叠( fold )

1.map的使用详解

集合的映射操作是将来在编写Spark/Flink用得最多的操作,是我们必须要掌握的掌握。map方法接收一个函数,将这个函数应用到每一个元素,返回一个新的列表

【1.1语法结构】

def map[B](f: (A) ⇒ B): TraversableOnce[B]

【1.2语法解释】

尖叫提示:

  • 1.同foreach一样,map传入的参数也是函数,匿名函数
  • 2.map 函数的逻辑是遍历集合中的元素并对每个元素调用函数。你也可以不调用任何函数,保持返回元素本身,但这样 map无法发挥作用,因为你在映射过后得到的是同样的集合。
  • 3.foreach返回值是Unit,而map返回值是集合,简单来说map就是对集合元素进行加工,不影响集合结构。
  • 4.map和foreach,以及后续其他的集合函数一样,都支持类型推定和用下划线_简化函数定义。

【1.3 map使用演示】

//基础演示
val chars = Seq('a', 'b', 'c', 'd') 
chars.map(ch => ch.toUpper) //输出为List(A, B, C, D)
scala> val numbers = Seq(3, 7, 2, 9, 6, 5, 1, 4, 2)
numbers: Seq[Int] = List(3, 7, 2, 9, 6, 5, 1, 4, 2)
scala> numbers.map(x=>x*x)
res4: Seq[Int] = List(9, 49, 4, 81, 36, 25, 1, 16, 4)

//注意这里打印x,最终返回的也是一个集合,只是空集合,空列表,列表结构不变
scala> numbers.map(x=>println(x))  
3
7
2
9
6
5
1
4
2
res5: Seq[Unit] = List((), (), (), (), (), (), (), (), ())

//标准函数,类型推定,下划线替代
scala> a.map((x:Int)=>x+1)
res8: List[Int] = List(2, 3, 4, 5)

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> a.map(_+1)
res6: List[Int] = List(2, 3, 4, 5)

scala> a.map(x=>x+1)
res7: List[Int] = List(2, 3, 4, 5)

2.flatten的使用详解

     flatten可以把嵌套的结构展开。当有一个集合的集合,然后你想对这些集合的所有元素进行操作时,就会用到 flatten。如果一个集合里存放的是元组,则没法压平,只能压平集合。flatten比较简单,没有参数。用的多是跟他名字很像的flatmap。

  val abcd = List('a', 'b', 'c', 'd')
  val efgj = List('e', 'f', 'g', 'h')
  val ijkl = List('i', 'j', 'k', 'l')
  val mnop = List('m', 'n', 'o', 'p')
  val qrst = List('q', 'r', 's', 't')
  val uvwx = List('u', 'v', 'w', 'x')
  val yz   = List('y', 'z')
  val alphabet = Seq(abcd, efgj, ijkl, mnop, qrst, uvwx, yz)
  println(alphabet.flatten)
  //结果:// ArrayBuffer(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)


//必须是集合的集合才能flatte,同时里面的集合不能是元组,否则也无法flatten。
scala>  val abc = List((1,2),(3,4))
abc: List[(Int, Int)] = List((1,2), (3,4))

scala> abc.flatten
<console>:13: error: No implicit view available from (Int, Int) => scala.collection.GenTraversableOnce[B].
       abc.flatten
           ^

scala> val abc= List(1,2,3)
abc: List[Int] = List(1, 2, 3)

scala> abc.flatten
<console>:13: error: No implicit view available from Int => scala.collection.GenTraversableOnce[B].
       abc.flatten
           ^

3.flatMap的使用详解

flatMap结合了map和flatten的功能。接收一个可以处理嵌套列表的函数,然后把返回结果连接起来。可以把flatMap,理解为先map,然后再flatten

【3.1语法结构】

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): TraversableOnce[B]

flatMap使用流程如下,对List内部成员先进行map,map的结果为一个返回,然后在返回的新List结果上进行flatten扁平化。简单理解就是flatmap可以拆分成map+flatten

 【尖叫提示】

  • 1.因为flatMap有flatten的操作所以flatMap的调用对象必须是集合的集合,要满足flatten的要求
  • 2.flatMap实际操作中就是可以转化成map函数+flatten函数一起操作,只是前者代码更加简洁
//1.使用map+flat
scala>   val fm  = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
fm: List[String] = List(hadoop hive spark flink flume, kudu hbase sqoop storm)

scala>  fm.map(x => x.split(" "))
res14: List[Array[String]] = List(Array(hadoop, hive, spark, flink, flume), Array(kudu, hbase, sqoop, storm))

scala> res14.flatten
res15: List[String] = List(hadoop, hive, spark, flink, flume, kudu, hbase, sqoop, storm)
scala>  fm.map(x => x.split(" ")).flatten
res18: List[String] = List(hadoop, hive, spark, flink, flume, kudu, hbase, sqoop, storm)

//2.直接使用flatMap
scala> fm.flatMap(x => x.split(" "))
res23: List[String] = List(hadoop, hive, spark, flink, flume, kudu, hbase, sqoop, storm)
scala> fm.flatMap(_.split(" "))
res20: List[String] = List(hadoop, hive, spark, flink, flume, kudu, hbase, sqoop, storm)

 

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 《Scala函数式编程》是一本非常实用的Scala编程书籍,旨在教读者如何使用Scala编程语言实现函数式编程。该书通过具体的实例和案例来阐述Scala函数式编程的核心概念和技术,包括函数式编程基础、函数的高阶抽象、类型系统、模式匹配、并发编程、I/O 和异常处理等方面内容。这些知识点包含了Scala编程语言的重要概念,可以帮助读者深入掌握Scala函数式编程的技术,并在实际应用中运用它们。此外,该书也涵盖了Scala代码风格和整洁性等方面,对编成良好的代码有很大的帮助。总之,这本书对于学习Scala函数式编程的人来说是非常有实践价值的一本书籍。 ### 回答2: Scala函数式编程的PDF是一本非常有价值的学习资料。对于想要深入学习Scala函数式编程的开发者,这本书提供了全面详尽的指导和实践经验,帮助开发者理解函数式编程的核心概念和思想,并将其应用于Scala程序开发中。 该书主要包括以下内容: 1.函数式编程的基本概念和原则,如不可变性、高阶函数、currying、尾递归等等。 2.函数式数据结构和算法的实现,包括列表、栈、队列、树、图等等。 3.如何使用Scala语言支持函数式编程的特性,如case class、模式匹配、参数化类型、协变和逆变等等。 4.如何使用Scala函数式编程框架,如Akka、Spark等来构建高效的分布式应用。 这本书主要适合已经有一定Scala编程基础或者其他函数式编程语言经验的开发者阅读,由于书中的内容较为深入和专业,对于初学者不太友好。但对于有一定基础的Scala开发者来说,该书是一本非常有价值的参考资料,可以帮助他们更深入地理解Scala函数式编程,提高代码质量和开发效率。 ### 回答3: Scala是一种支持函数式编程范式的编程语言,从而满足了编程语言发展中对于高度抽象和复杂数据处理的需求。Scala函数式编程pdf是一个学习Scala函数式编程理论和实践的重要资源。 Scala函数式编程pdf包含Scala函数式编程核心概念和技术,例如高阶函数、不可变性、模式匹配和递归等。它还涵盖了Scala函数式编程中的一些常见问题和解决方案,以及Scala函数式编程如何与面向对象编程 (OOP)相融合等。 Scala函数式编程pdf还提供了丰富的实际案例,包括使用Scala函数式编程技术实现算法、数据处理、Web应用程序、分布式编程等等。 总之,Scala函数式编程pdf是Scala程序员学习和实践函数式编程的重要资源,它提供了理论、实践和案例相结合的综合性学习体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涤生大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值