Scala快速入门-基本数据结构
模式匹配
使用用模式匹配实现斐波那契
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)
广告
Scala快速入门-基本数据结构的更多相关文章
- Scala快速入门到精通 视频教程 百度云网盘下载地址
Scala快速入门到精通 视频教程 百度云网盘下载地址 Scala快速入门到精通 下载地址链接:https://pan.baidu.com/s/1bqGIKyF 密码:ojwd
- scala快速入门之文档注释
scala快速入门之文档注释 1.在项目栏的目录树中找到该源码,右击点击Show in Explorer, 即可找到该源码的本地路径,在路径中输入cmd 2.执行scaladoc -d 生成文档注释 ...
- Scala快速入门 - 基础语法篇
本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...
- Scala快速入门(四)——继承、接口
Scala快速入门(四)--继承.接口 一.继承 1.继承的概念:省略 2.模板: class Person(n:String,a:Int) { var name:String=n var age:I ...
- Scala - 快速学习05 - 数据结构
1- 数组(Array) 数组一般包括定长数组和变长数组. 可以不指明数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型. 在Scala中,对数组元素的应用,是使用圆括号,而不是方括号. ...
- Spark(七) -- Scala快速入门
Scala作为Spark的开发语言,想要成为Spark高手,精通Scala是必须要走的一条路 然后一门语言并不是你想精通就能够精通的,更何况是Scala这种面向对象又面向函数的编程语言,个人觉得其学习 ...
- Scala 快速入门
 Scalable 编程语言 纯正的的面向对象语言 函数式编程语言 无缝的java互操作 scala之父 Martin Odersky 1. 函数式编程 函数式编程(functional progr ...
- Spark记录-scala快速入门
1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...
- Scala快速入门-基础
HelloWorld 从HelloWorld开始,使用scala IDE编辑器. 新建scala project 新建scala object 编写HelloWorld run as scala ap ...
随机推荐
- 动态的GRE OVER IPSEC的实验模拟与分析
此篇博客正在介绍的是下图中的Dynamic P2P GRE OVER IPSEC VPN: 为什么出现这种动态的GRE OVER IPSEC VPN技术呢? 首先在前面几篇博客中已经介绍过了,动态是为 ...
- Python学习笔记四:列表,购物车程序实例
列表 切片 中括号,逗号分隔,可以一次取出多个元素,起始位置包括,结束位置不包括(顾头不顾尾) 如果取最后一个,而且不知道列表长度,可以使用负数(-1是最后一个,以此类推) 如果取最后几个,记住从左往 ...
- 基于FDC2214的手势识别
基于FDC2214的手势识别 1.本次题目来源于2018年全国电子设计大赛D题,要求实现对石头.剪刀.布以及数字12345的识别:同时在上述基础上实现对手势的学习. 2.硬件实现: 硬件主要采用STM ...
- 解决brew下载php(不存在libphp7.so)
我是一名PHP的初学者,在mac上安装php7参考作者 coolma <在mac中如何安装php7>: 1. 安装Homebrew(mac ox不可或缺套件管理器,方便快捷的安装插件等) ...
- 从官网下载centos
今天想从官网下载6.5版本的CentOS,结果找了好一会儿才找到,赶紧记录下来,以备以后查询. 第一步在百度搜索centos,点击"Download CentOS",如下图所示. ...
- 鸡啄米:C++编程之十三学习之类与对象,类的声明,成员的访问控制
1. 本次学习鸡啄米课程第13篇,把比较重要的学习记录下来,以敦促自己更好的学习.推荐他们的网址学习:http://www.jizhuomi.com/school/c/97.html 2. 在面向过程 ...
- 虚拟机安装win7 64位-完美解决-费元星
安装虚拟机是为了安装一个oracle ,在本机安装 ,本机会卡死,不是每次启动电脑都用oralce,而且有时候服务是关不干净的,所以安装在虚拟机里,需要的时候在开启,特做此记录! 费元星版权Q[971 ...
- 「专题训练」Air Raid(HDU-1151)
题目 在一个城市里有\(n\)个地点和\(k\)条道路,道路是无环的(也就是说一定可以二分染色--回路长度为偶数0),现在伞兵需要去n个地点视察,只能沿着路的方向走,问最少需要多少伞兵. 分析 这是什 ...
- Spring全局变量
压测spring框架的webservice接口,大并发量下响应值与预期值不一致 经查,开发在类中使用全局变量导致: springmvc核心控制器DispatcherServlet 默认为每个contr ...
- jenkins配置git+maven+Publish over SSH
一.配置git 1.新建项目,源码管理选择git 2.Repository URL输入git目录 3.Credentials中选择新增凭据,凭据类型选择SSH,usename输入git,passphr ...