模式匹配

使用用模式匹配实现斐波那契

def fibonacci(in: Any): Int = in match {
case 0 => 0
case 1 => 1
case n: Int if(n > 1)=> fibonacci(n - 1) + fibonacci(n - 2)
case _ => 0
} println(fibonacci(3))

元组tuple

元组可以保存不同类型的值,不能通过名称获取字段,而是使用位置下标来读取对象;而且这个下标基于1,而不是基于0。

val hostPort = ("localhost", 80)
println("host:%s,port:%s".format(hostPort._1,hostPort._2))

执行结果:

host:localhost,port:80

选项 Option

Option 是一个表示有可能包含值的容器。

Option基本的接口是这样的:

trait Option[T] {
def isDefined: Boolean
def get: T
def getOrElse(t: T): T
}

映射 Map

Option本身是泛型的,并且有两个子类: Some[T] 或 None

Map.get 使用 Option 作为其返回值,表示这个方法也许不会返回你请求的值。

val map = Map(1 -> "one", 2 -> "two")
println(map.get(2))
println(map.get(3))

执行结果:

Some(two)
None

函数组合子(Functional Combinators)

map

map对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。

    val numbers = List(1, 2, 3)
val double = numbers.map((i: Int) => i * 2)
val squared = numbers.map((i: Int) => BigInt(i).pow(3))
println("%s".format(numbers))
println(double)
println(squared)
//传入一个部分应用函数
def timesTwo(i: Int): Int = i * 2
val doubleFunction = numbers.map(timesTwo _)
println(doubleFunction)

执行结果:

List(1, 2, 3)
List(2, 4, 6)
List(1, 8, 27)
List(2, 4, 6)

foreach

foreach很像map,但没有返回值。foreach仅用于有副作用[side-effects]的函数

    //foreach返回值为Unit即void
val foreachResult = numbers.foreach { (i: Int) => i * 2 }
println(foreachResult)

执行结果:

()

filter

filter移除任何对传入函数计算结果为false的元素

    val filterResult = numbers.filter { (i: Int) => i % 2 == 0 }
println(filterResult)

执行结果:

List(2)

zip

zip将两个列表的内容聚合到一个对偶列表中,多余的元素删除

    val zipResult = numbers.zip(List('a', 'b', 'c', 'd'))
println(zipResult)

执行结果:

List((1,a), (2,b), (3,c))

partition

partition将使用给定的谓词函数分割列表。

    val partitionResult = numbers.partition { _ % 2 == 0 }
println("partition result:%s".format(partitionResult))

执行结果:

partition result:(List(2),List(1, 3))

find

find返回集合中第一个匹配谓词函数的元素

    var findResult = numbers.find(_ == 1)
println("find result:%s".format(findResult))
findResult = numbers.find(_ > 3)
println("find result:%s".format(findResult))

执行结果:

find result:Some(1)
find result:None

drop&dropWhile

drop删除前i个元素,dropWhile删除直到不满足谓词函数的元素

    var dropResult = numbers.drop(2)
println("drop result:%s".format(dropResult))
dropResult = numbers.dropWhile(_ % 2 != 0)
println("dropWhile result:%s".format(dropResult))

执行结果:

drop result:List(3)
dropWhile result:List(2, 3)

foldLeft&foldRight

0为初始值(记住numbers是List[Int]类型),m作为一个累加器,foldRight与foldLeft运行过程相反

    var foldLeftResult = numbers.foldLeft(0) {
(m: Int, n: Int) => println("m:" + m + " n:" + n); m + n
}
println("foldLeft result:%s".format(foldLeftResult))
var foldRightResult = numbers.foldRight(0) {
(m: Int, n: Int) => println("m:" + m + " n:" + n); m + n
}
println("foldRight result:%s".format(foldRightResult))

执行结果:

m:0 n:1
m:1 n:2
m:3 n:3
foldLeft result:6
m:3 n:0
m:2 n:3
m:1 n:5
foldRight result:6

flatten

flatten将嵌套结构扁平化为一个层次的集合

    var flattenResult = List(List(1, 2, 3), List(4, 5, 6)).flatten
println("flatten result:%s".format(flattenResult))

执行结果:

flatten result:List(1, 2, 3, 4, 5, 6)

flatMap

flatMap是一种常用的组合子,结合映射[mapping]和扁平化[flattening]。 flatMap需要一个处理嵌套列表的函数,然后将结果串连起来。flatMap是map和flatten的组合。

    val nestedNumbers = List(List(1, 2), List(3, 4))
var flatMapResult = nestedNumbers.flatMap(x => x.map(_ * 2))
println("flatMap result:%s".format(flatMapResult))
flatMapResult = nestedNumbers.map(x => x.map(_ * 2)).flatten
println("flatMap result:%s".format(flatMapResult))

执行结果:

flatMap result:List(2, 4, 6, 8)
flatMap result:List(2, 4, 6, 8)

广告

点击Spark加入群Spark,分享更多Spark相关信息

Scala快速入门-基本数据结构的更多相关文章

  1. Scala快速入门到精通 视频教程 百度云网盘下载地址

    Scala快速入门到精通  视频教程 百度云网盘下载地址 Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bqGIKyF 密码:ojwd

  2. scala快速入门之文档注释

    scala快速入门之文档注释 1.在项目栏的目录树中找到该源码,右击点击Show in Explorer, 即可找到该源码的本地路径,在路径中输入cmd 2.执行scaladoc -d  生成文档注释 ...

  3. Scala快速入门 - 基础语法篇

    本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...

  4. Scala快速入门(四)——继承、接口

    Scala快速入门(四)--继承.接口 一.继承 1.继承的概念:省略 2.模板: class Person(n:String,a:Int) { var name:String=n var age:I ...

  5. Scala - 快速学习05 - 数据结构

    1- 数组(Array) 数组一般包括定长数组和变长数组. 可以不指明数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型. 在Scala中,对数组元素的应用,是使用圆括号,而不是方括号. ...

  6. Spark(七) -- Scala快速入门

    Scala作为Spark的开发语言,想要成为Spark高手,精通Scala是必须要走的一条路 然后一门语言并不是你想精通就能够精通的,更何况是Scala这种面向对象又面向函数的编程语言,个人觉得其学习 ...

  7. Scala 快速入门

     Scalable 编程语言 纯正的的面向对象语言 函数式编程语言 无缝的java互操作 scala之父 Martin Odersky 1. 函数式编程 函数式编程(functional progr ...

  8. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...

  9. Scala快速入门-基础

    HelloWorld 从HelloWorld开始,使用scala IDE编辑器. 新建scala project 新建scala object 编写HelloWorld run as scala ap ...

随机推荐

  1. 【Spark】算子

    1. mapWith mapWith(i => i*10)((a,b) => b+2) (拿到分区号)(a是每次取到的RDD中的元素,b接收i*10的结果) 2. flatMapWith ...

  2. [转]MySQL日期与时间戳常用函数

    本文原文地址:https://www.cnblogs.com/jhy-ocean/p/5560857.html 平时比较常用的时间.字符串.时间戳之间的互相转换,虽然常用但是几乎每次使用时候都喜欢去搜 ...

  3. Mac下PHP的环境搭建

    * 前段时间手欠 ... 入手了一个二手的Macbook pro ! 配置挺高的 16款13寸的基本顶配了 ... 只差 硬盘不是1T的 ... 可以脑补一下配置了* 话说 不是所有程序猿都说 每个程 ...

  4. Centos7 Redis3.0 集群搭建备忘

    (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:7000 127.0.0. ...

  5. (数据科学学习手札45)Scala基础知识

    一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...

  6. 由OpenResty粘合的企业Web架构

    前言:    2012年2月章亦春(agentzh)在Tech-Club的一次线下聚会上以<由Lua 粘合的Nginx生态环境>为主题做了演讲,分析了企业Web架构的趋势,即一个看起来完整 ...

  7. vue跨域访问

    第一次创建vue项目,画完静态页面一切顺利,准备和后台进行联调,问题来了,无论怎么调试使用Axios,jQuary还是使用原生的Ajax请求都访问不通(前提条件,另外一个人的电脑当成服务器,进行访问) ...

  8. Nginx初体验(一):nginx介绍

    今天我们来介绍一下Nginx. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理,负载均衡,动静分离 首先我们来介绍一下正向代理服务器 ...

  9. HDU 5972 Regular Number

    Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意: 给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等 ...

  10. 说说Ruby中的Symbol类

    相信大多人在学习Ruby过程中,都被Symbol类型迷惑过.因为其他语言基本没有这个类.而且它太灵活了.很多人只知其一不知其二. 本人查了不少资料,自己总结一下. 首先来看一下Ruby之父所著的< ...