本来准备在私信里直接回复了,但是发现不太方便,就简要回答在这里。
问题 写道
对于scala的简洁十分佩服,但又觉得比较晦涩,例如一例,Map("a" -> List(11,111)).flatMap(_._2),可否说下最后那个函数做了什么,真正在开发的时候也会如此简洁?谢谢
先回答一点,在实际使用中,Scala毫无疑问就是这么简单。
首先
Map("a" -> List(11,111)).flatMap(_._2) //List(11, 111)
为什么能以_._2调用是因为 -> 标识符产生的是一个Tuple2对象(包含有两个元素的元组,如(1,2))
def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
而Tuple2对象就可以分别使用_1,_2来调用第一第二个元素。
回过来看 (☆)
Map("a" -> List(11,111)).map(_._2) //List(List(11, 111))
这里_._2就相当于是取得元组("a",List(11,111))的第二个元素即List(11, 111)
为什么会又多出一个List? 看下scala.collection.immutable.Map的map方法的定义:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That ={ val b = bf(repr) b.sizeHint(this) for (x <- this) b += f(x) b.result }
具体不解释了,顺着上面的方法看下去就知道了。稍微提示一下,(☆)那部分代码带着-Xprint:typer编译的部分结果是:
scala.this.Predef.Map.apply[java.lang.String, List[Int]](scala.this.Predef.any2ArrowAssoc[java.lang.String]("a").->[List[Int]](immutable.this.List.apply[Int](11, 111))).map[List[Int], scala.collection.immutable.Iterable[List[Int]]](((x$1: (java.lang.String, List[Int])) => x$1._2))(immutable.this.Iterable.canBuildFrom[List[Int]])
而flatMap只是在输出结果时会调用 ++= 而已
譬如
val l1 = List(1,2,3) val l2 = List(4,5,6) val l3 = List(7,8,9) val bigList = List(l1,l2,l3) println(bigList) //List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) val lb = scala.collection.mutable.ListBuffer[Int]() bigList.foreach(xs =>lb ++= xs) println(lb.toList) //List(1, 2, 3, 4, 5, 6, 7, 8, 9)
事实上也就是走到:
def ++=(xs: TraversableOnce[A]): this.type = { xs.seq foreach += ; this }
所以自己可以思考一下下面代码的结果:
val rs1 = Map("a" -> List(List(11),List(111))).map(_._2) val rs2 = Map("a" -> List(List(11),List(111))).flatMap(_._2) val rs3 = Map("a" -> List(11), "b" -> List(111)).flatMap(_._2)
List(List(List(11), List(111)))
List(List(11), List(111))
List(11, 111)
以为着即使flat也不能把把嵌套List的压平。
码了半小时的字,有没有效果啊?
相关推荐
一、 Scala简介 Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,...Scala 就像一位武林中的集大成者,将过去几十年计算机语言发展历史中的精萃集于一身,化繁为简,为程序员们提供了一种新的选择。
scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3
此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...
很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...
scala2.11.4win64位本地安装包,不需要用户安装,解压完之后配置环境变量即可使用
这篇文章是Scala方面的,scala的windows安装,scala的linux安装,以及第一个scala程序
scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...
scala2.12.1Windows镜像包
本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行了参照,方便读者快速上手 Scala;第二部分进一步介绍 Scala 的一些中级知识,以及 与 Java 的一些差异点,方便读者编写...
scala3 scala3 scala3 scala3 scala3
scala eclipse插件 拷贝到相应的目录即可使用,百度一大堆
这是一个简单实用的scala集成mybatis数据库查询代码,简单明了
scala编程进阶过程中不可或缺的书籍之一,详细介绍了scala语言的各种中高级语法,对于初学和高级开发人员有很大帮助
scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含<ScalaQuery_Commerzbank_2011><twitter-...
scala 安装包scala 安装包scala 安装包scala 安装包scala 安装包scala 安装包
The Neophyte's Guide to Scala 是 Daniel Westheide 写的一系列有关 Scala 的文章。 ---------------------------------------------------- 本 PDF 基于开源文档,目录书签齐全。 版权归原作者,翻译版权归译者。...
scala的小例子一个简单的例子有一点小帮助
scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载scala SDK 2.10下载...
这个打包文件中包含了《SCALA程序设计-JAVA虚拟机多核编程实战》《Scala编程-中文-完整版》《Scala in Action》三本书,足以让你从scala入门到精通,让我们一起愉快的学习吧。spark,scala醉了醉了。哈哈