`
chenchao051
  • 浏览: 135433 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

回答一位网友对Scala的提问

阅读更多

本来准备在私信里直接回复了,但是发现不太方便,就简要回答在这里。

问题 写道
对于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的压平。

 

码了半小时的字,有没有效果啊?

 

分享到:
评论
2 楼 chenchao051 2013-10-25  
耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶 耶
dogstar 写道
唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.
1 楼 dogstar 2013-10-25  
唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.

相关推荐

    Scala实战.docx

    一、 Scala简介 Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,...Scala 就像一位武林中的集大成者,将过去几十年计算机语言发展历史中的精萃集于一身,化繁为简,为程序员们提供了一种新的选择。

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala2.11.4win64位安装包

    scala2.11.4win64位本地安装包,不需要用户安装,解压完之后配置环境变量即可使用

    Scala学习之路(一)

    这篇文章是Scala方面的,scala的windows安装,scala的linux安装,以及第一个scala程序

    scala-sbt-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镜像包

    scala2.12.1Windows镜像包

    Scala实用指南

    本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行了参照,方便读者快速上手 Scala;第二部分进一步介绍 Scala 的一些中级知识,以及 与 Java 的一些差异点,方便读者编写...

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    eclipse插件 scala下载

    scala eclipse插件 拷贝到相应的目录即可使用,百度一大堆

    scala + mybatis 数据库查询

    这是一个简单实用的scala集成mybatis数据库查询代码,简单明了

    scala实战高清讲解

    scala编程进阶过程中不可或缺的书籍之一,详细介绍了scala语言的各种中高级语法,对于初学和高级开发人员有很大帮助

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含&lt;ScalaQuery_Commerzbank_2011&gt;&lt;twitter-...

    scala 安装包

    scala 安装包scala 安装包scala 安装包scala 安装包scala 安装包scala 安装包

    Scala 初学者指南

    The Neophyte's Guide to Scala 是 Daniel Westheide 写的一系列有关 Scala 的文章。 ---------------------------------------------------- 本 PDF 基于开源文档,目录书签齐全。 版权归原作者,翻译版权归译者。...

    scala学习源代码

    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 SDK 2.10下载...

    scala 3本书打包

    这个打包文件中包含了《SCALA程序设计-JAVA虚拟机多核编程实战》《Scala编程-中文-完整版》《Scala in Action》三本书,足以让你从scala入门到精通,让我们一起愉快的学习吧。spark,scala醉了醉了。哈哈

Global site tag (gtag.js) - Google Analytics