一、常用的集合方法

1.可遍历集合的常用方法

下表列出了Traverable在所有集合常用的方法。接下来的符号:

  • c代表一个集合

  • f代表一个函数

  • p代表一个谓词

  • n代表一个数字

  • op代表一个简单的操作(通常是一个简单的函数)

2.可变的集合方法

下表里的是可变集合常用的操作符:

3.不可变的集合方法

注意不可变集合不可被修改,所以在第一行的每个表达式的结果必须赋给一个新变量。

操作符 描述
c1 ++ c2 把c2集合的元素附加到c1里创造一个新的集合
  1. scala> val c1 = Vector(1,2,3,4,5)
  2. c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> val c2 = Vector(6,7,8)
  5. c2: scala.collection.immutable.Vector[Int] = Vector(6, 7, 8)
  6.  
  7. scala> c1 ++ c2
  8. res35: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8)

操作符 描述
c :+ e  返回把元素e附加到集合c的新集合
  1. scala> val v1 = Vector(1,2,3,4,5)
  2. c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> val e = 10
  5. e: Int = 10
  6.  
  7. scala> v1 :+ e
  8. res38: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 10)

操作符 描述
e +: c2 返回一个把元素e前插到集合c的新集合
  1. scala> val v1 = Vector(1,2,3,4,5)
  2. c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> val e = 10
  5. e: Int = 10
  6.  
  7. scala> e +: v1
  8. res39: scala.collection.immutable.Vector[Int] = Vector(10, 1, 2, 3, 4, 5)

操作符 描述
e :: list 返回一个把e前插到名为list列表的集合(::只在List集合上用)
  1. scala> val list = List(7,8,9)
  2. list: List[Int] = List(7, 8, 9)
  3.  
  4. scala> val e = 10
  5. e: Int = 10
  6.  
  7. scala> e :: list
  8. res75: List[Int] = List(10, 7, 8, 9)

操作符 描述
c drop n 把c2集合的元素附加到c1里创造一个新的集合
  1. scala> val v1 = Vector(1,2,3,4,5)
  2. v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> val n = 3
  5. n: Int = 3
  6.  
  7. scala> v1 drop n
  8. res1: scala.collection.immutable.Vector[Int] = Vector(4, 5)

操作符 描述
c1 take n 把集合的前两个元素列出来
  1. scala> val c1 = Vector(1,2,3,4,5)
  2. c1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> c1 take 2
  5. res82: scala.collection.immutable.Vector[Int] = Vector(1, 2)

4.可变和不可变的map的常用方法

  • m代表一个不可变map

  • mm代表一个可变的map

  • k代表一个键

  • v代表一个值

  • p代表一个谓词

  • c代表一个集合

如果是var修饰,引用可变,支持读写。
如果是val修饰,引用不可变,支持读写。

操作符 描述
m - k 返回删除key(以及相应的value的值)后的map
  1. scala> val v1 = Vector(1,2,3,4,5)
  2. v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
  3.  
  4. scala> val map = Map(1 -> "a",2 -> "b",3 -> "c")
  5. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)
  6.  
  7. scala> map - 1
  8. res5: scala.collection.immutable.Map[Int,String] = Map(2 -> b, 3 -> c)

操作符 描述
m - (k1,k2,k3) 返回删除k1,k2,k3后的map
  1. scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
  2. map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
  3.  
  4. scala> map - (1,3,5)
  5. res6: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)

操作符 描述
m -- c 返回删除key后的map,c是指集合
  1. scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
  2. map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
  3.  
  4. scala> val c = Vector(1,3,5)
  5. c: scala.collection.immutable.Vector[Int] = Vector(1, 3, 5)
  6.  
  7. scala> map -- c
  8. res7: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)

操作符 描述
m -- List(k1,k2) 返回删除key后的map
  1. 1
  2. scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
  3. map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2-> b, 3 -> c, 4 -> d)
  4.  
  5. scala> val list = List(1,3,5)
  6. list: List[Int] = List(1, 3, 5)
  7.  
  8. scala> map -- list
  9. res8: scala.collection.immutable.Map[Int,String] = Map(6 -> f, 2 -> b, 4 -> d)
  10. 2
  11. scala> val map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d",5 -> "e",6 -> "f")
  12. map: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 6 -> f, 2
  13. -> b, 3 -> c, 4 -> d)
  14.  
  15. scala> map -- List(1,2,3)
  16. res9: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 6 -> f, 4 -> d)

操作符 描述
m(k) 返回k的value
  1. scala> var map = Map(1 -> 1,2 -> 2,3 -> 3,4 -> 4)
  2. map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 ->4)
  3.  
  4. scala> map(2)
  5. res34: Int = 2

操作符 描述
m contains k 如果map包含k则返回true
  1. scala> var map = Map(1 -> 1,2 -> 2,3 -> 3,4 -> 4)
  2. map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 ->4)
  3.  
  4. scala> map contains 3
  5. res36: Boolean = true

操作符 描述
m get k 如果k存在返回Some[A]作为key的值,否则None
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map get 2
  5. res44: Option[String] = Some(b)
  6.  
  7. scala> map get 5
  8. res45: Option[String] = None

操作符 描述
m getOrElse(k,d) 如果k找到的话,返回k的值,否则返回默认值d
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map getOrElse(2,"hello")
  5. res46: String = b
  6.  
  7. scala> map getOrElse(5,"hello")
  8. res47: String = hello

操作符 描述
m isDefinedAt k 如果map包含k则返回true
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map isDefinedAt 2
  5. res48: Boolean = true
  6.  
  7. scala> map isDefinedAt 5
  8. res49: Boolean = false

操作符 描述
m keys 把map中的keys作为Iterable返回
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map keys
  5. warning: there was one feature warning; re-run with -feature for details
  6. res50: Iterable[Int] = Set(1, 2, 3, 4)

操作符 描述
m keySet 把map中的keys作为Set返回
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map keySet
  5. warning: there was one feature warning; re-run with -feature for details
  6. res54: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

操作符 描述
m values 把map中的value作为Iterable返回
  1. scala> var map = Map(1 -> "a",2 -> "b",3 -> "c",4 -> "d")
  2. map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4-> d)
  3.  
  4. scala> map values
  5. warning: there was one feature warning; re-run with -feature for details
  6. res56: Iterable[String] = MapLike(a, b, c, d)

二、在创建集合时声明一个类型

想要创建一个混合型的集合,scala不会自动分配想要的类型。

创建一个手动的集合如下:

  1. scala> trait Animal
  2. defined trait Animal
  3.  
  4. scala> trait FurryAnimal extends Animal
  5. defined trait FurryAnimal
  6.  
  7. scala> case class Dog(name: String) extends Animal
  8. defined class Dog
  9.  
  10. scala> case class Cat(name: String) extends Animal
  11. defined class Cat
  12.  
  13. scala> val x = Array(Dog("Fido"),Cat("Felix"))
  14. x: Array[Product with Serializable with Animal] = Array(Dog(Fido), Cat(Felix))

如上所示,scala给product指定了Serializable和Animal类型。如果想要一个Array[Animal],手动需要指定类型:

  1. scala> val x = Array[Animal](Dog("Fido"),Cat("Felix"))
  2. x: Array[Animal] = Array(Dog(Fido), Cat(Felix))

三、可变变量集合与不可变量集合

但把一个不可变的Vector赋给一个可变的var时,似乎可以给它添加元素。

  1. scala> var sisters = Vector("Melinda")
  2. sisters: scala.collection.immutable.Vector[String] = Vector(Melinda)
  3.  
  4. scala> sisters = sisters :+ "Melissa"
  5. sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa)
  6.  
  7. scala> sisters = sisters :+ "Marisa"
  8. sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa, Ma
  9. risa)
  10.  
  11. scala> sisters.foreach(println)
  12. Melinda
  13. Melissa
  14. Marisa

尽管你看起来改变了一个不可改变的集合,但实际上是每次用:+方法时sisters变量会指向一个新的集合。sisters变量是可变的,所以每次执行时相当于重新赋值一个新的集合。

总结:

  • 一个可变的变量var可以被赋予一个新的数据。
  • 一个不可变的变量val就如java中的final变量,不可能被重新赋值。
  • 在可变集合的元素中可以被改变(ArrayBuffer)。
  • 在不可被改变的集合元素中不可被改变(Vector)。

scala的多种集合的使用(2)之集合常用方法的更多相关文章

  1. scala的多种集合的使用(1)之集合层级结构与分类

    一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...

  2. Scala学习之路 (四)Scala的数组、映射、元组、集合

    一.数组 1.定长数组和变长数组 import scala.collection.mutable.ArrayBuffer object TestScala { def main(args: Array ...

  3. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  4. 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

    [源码下载] 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合 作 ...

  5. 【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合

    [ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整 ...

  6. 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

    背水一战 Windows 10 之 绑定 通过 Binding 绑定对象 通过 x:Bind 绑定对象 通过 Binding 绑定集合 通过 x:Bind 绑定集合 示例1.演示如何通过 Bindin ...

  7. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List<类名>的比较

    1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...

  8. [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)

    ---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...

  9. java集合框架工具类Collections,集合的操作

    1 import java.util.*; public class asList { public static void main(String args[]) { // int arr[] = ...

随机推荐

  1. .NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

  2. 大名鼎鼎的红黑树,你get了么?2-3树 绝对平衡 右旋转 左旋转 颜色反转

    前言 11.1新的一月加油!这个购物狂欢的季节,一看,已囊中羞涩!赶紧来恶补一下红黑树和2-3树吧!红黑树真的算是大名鼎鼎了吧?即使你不了解它,但一定听过吧?下面跟随我来揭开神秘的面纱吧! 一.2-3 ...

  3. Java集合与泛型中的几个陷阱,你掉进了几个?

    下面我总结了集合.泛型.数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获. 1.List ,List<?> 与 List<Object> 有区别吗? 说实话,我敢保证很 ...

  4. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. JavaScript夯实基础系列(五):类

      JavaScript中没有类,是通过使用构造函数和原型模式的组合来实现类似其它面向对象编程语言中"类"的功能.ES6引入的关键字class,形式上向其它面向对象编程语言靠拢,其 ...

  6. Java 核心系列教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最 ...

  7. Reactor 典型的 NIO 编程模型

    Doug Lea 在 Scalable IO in Java 的 PPT 中描述了 Reactor 编程模型的思想,大部分 NIO 框架和一些中间件的 NIO 编程都与它一样或是它的变体.本文结合 P ...

  8. 把项目中那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建

        在我们开发项目的时候,经常会遇到大块数据的问题(2M-100M),比如说保存报表中1w个人的ID号,他就像一个肿瘤一样,存储在服务器哪里都 觉得恶心,放在redis,mongodb中吧,一下子 ...

  9. Java基础系列--HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...

  10. C++项目中采用CLR的方式调用C#编写的dll

    1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...