Scala基本数据结构有数组Array,列表List,集合Set,元组Tuple,映射Map,选项Option。
Scala集合算子有map,foreach,filter,zip,partition,find,drop and dropWhile,foldRight and
foldLeft,flatten,flatMap,扩展的函数组合子,Map?
六大基本数据结构
数组Array
数组是有序,可重复,可变的数据集。
有序则可以通过下标获取,下标从0开始。
列表List
列表是有序的,数据可重复,但是不可变。
集合Set
集合无序且数据不可重复。
元组Tuple
元组在不使用类的情况下,将元素组合起来形成简单的逻辑集合。与样本类不同的时候,原则不能通过名称获取字段,而是使用位置下标来读取队形;而且这个下标起始为1,而不是0。
当元组只包含两个元素时,创建时可以使用语法:->
映射Map
也可以理解为二元元组集
选项Option
Option是一个表示有可能包含值的容器。
Option本身是泛型的,并且有两个子类:Some[T]和None
Optio接口:
trait Option[T]{
def isDefined:Boolean
def get: T
def getOrElse(t: T): T
}
Map.get方法的返回值即为Option,表示这个方法有可能不会返回请求的值。不存在时,返回为None。
isDefined方法的使用:
常用方法getOrElse和模式匹配的使用
函数组合子
组合子(combinator),是函数式编程里面的重要思想。组合子通过定义最基本的原子操作,定义基本的组合规则,然后把这些原则以各种方法组合起来。也有人把面向组合子(Combinator-Oriented)的编程思想叫做“演绎法”,相对于分析归纳需求并根据需求高度抽象为对象且面向于对象的编程思想(OO,Object Oriented也有人叫归纳法)而言,组合子更具有函数式的思想。
OO思想(归纳法)怎么理解呢?其实OO是我们最常见的一种编程思路,往往是由需求导向,先有了需求,然后我们根据需求分析问题,进行拆分,最后抽象为对象然后转化为我们的程序语言逻辑实现。
CO思想怎么理解呢?CO更像是搭积木,我们有各种积木(即组合子),根据积木的各种组合从而获得形式各异的造型结构。
总之一句话。OO的原材料(对象)需要我们自己构建,CO提供了原材料(组合子)库供我们自己选择使用。
下面引用Scala School中的解释原文。
List(1,2,3)map squared对列表中的每一个元素都应用了squared平方函数,并返回一个新的列表List(1,4,9)。
map
map对列表中每个元素应用一个函数,返回应用后的元素所组成的列表。也可以传入一个方法,Scala编译器自动把方法转换为函数。
说到这里我们可以回顾一下函数和方法的区别?
foreach
foreach同样是对列表中的每一个元素作用一个函数,但是没有返回值。注意foreach仅用于有副作用的函数。
那什么是副作用函数呢?函数式编程中的函数有纯函数和副作用函数的区别,后续章节我们再讨论。
注意:这里我们发现我们传入纯函数
(x: Int) => x * x
并没有对list的内容造成影响。
filter
filter移除任何对传入函数计算结果为false的元素。返回一个布尔值的函数通常被称为谓词函数(或判定函数)。
zip
zip将两个列表的内容聚合到一个对偶列表中。注意列表长度的影响。
partition
partition将使用给定的谓词函数分割列表。
find
find返回集合中第一个匹配谓词函数的元素。
drop & dropWhile
drop将删除前 n 个元素。
dropWhile将删除匹配谓词函数的第一个元素。
foldLeft
下面0为初始值,m为累加器,n为列表值。
可视化观察运行过程:
foldRight
foldRight和foldLeft运行过程相反。
flatten
flatten将嵌套结构扁平化为一个层级。
flatMap
flatMap是将映射和扁平化结合起来的组合子。执行逻辑为先映射后扁平化。
等价逻辑为:
扩展函数组合子
扩展函数组合子即自定义的函数组合子,上述的函数组合子都可以通过fold方法实现。
Map?
所有展示的函数组合子都可以在Map上使用。Map可以被看做是一个二元组的列表,所以输入的函数是处理一个键和值的二元组。