`
chenchao051
  • 浏览: 137590 次
  • 性别: 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  
唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.唉.

相关推荐

    scala3 scala3 scala3 scala3 scala3

    Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...

    scala2.11.4win64位安装包

    总之,"scala2.11.4win64位安装包"提供了一个便捷的方式来开始Scala编程之旅,无论你是新手还是经验丰富的开发者,都可以通过这个包快速构建和运行Scala应用程序。只要正确配置环境变量,就可以充分利用Scala的全部...

    scala sdk scala-2.12.3

    Scala-2.12.3是Scala的一个特定版本,它包含了对Java 8及更高版本的支持,并提供了性能优化和新功能。 Scala SDK主要包括以下组件: 1. **编译器**:Scala编译器将Scala源代码转换为Java字节码,使得程序可以在...

    Programming.in.Scala.pdf

    1. 知名人士对《Programming in Scala》的前一版给予了高度评价。其中提到书中的写作风格清晰、简练,解释深入且容易理解,能有效回答读者在阅读过程中产生的问题。 2. 肯·埃格瓦里(Ken Egervari)作为首席软件...

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    Scala学习之路(一)

    ### Scala学习之路(一)—— 开发环境搭建与首个程序 #### 一、Scala简介 Scala是一种多范式编程语言,旨在实现可扩展性,并融合了面向对象编程和函数式编程的最佳特性。作为一种与Java非常相似的语言,Scala能够...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    scala-2.12.10.zip

    在Scala 2.12.10中,主要关注点包括性能提升、对Java 8的更好支持以及对JVM的优化。这个版本引入了更快的编译器,使得开发过程更加流畅。此外,它还增强了类型推断,使得编写代码更加简洁。对于Windows用户来说,这...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    Scala语法简明教程

    - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网的编程语言。Odersky之前还参与开发了Generic Java以及Sun...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala学习源代码

    模式匹配是Scala中的一个强大特性,它允许我们对值进行解构,并根据不同的结构执行不同的操作。在处理数据结构或事件处理时,模式匹配能提供清晰的代码结构。 此外,Scala还支持 Actors模型,这是处理并发和分布式...

    scala-2.11.12 win msi 安装包

    总的来说,这个压缩包为Windows用户提供了Scala编程环境的便捷安装方式,尤其适合那些对Scala感兴趣并希望通过它来学习Spark或者开发分布式系统的人。同时,Scala的强大功能和灵活性使其在处理复杂计算和大数据分析...

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...

    scala-2.11.8.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    windows版scala-2.11.12.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。Scala运行在Java虚拟机(JVM)上,因此可以充分利用Java生态系统的丰富资源。在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala ...

    Scala编程实战.zip

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

Global site tag (gtag.js) - Google Analytics