scala集合类详解(总结的比较全面)

Scala集合方法大全(倾心整理) 这篇博客按Scala算子不同的实现功能进行汇总,含案例方便记忆 主要分为:提取、修改、迭代处理、分段|分组、聚合、验证、容量、转变 提取 foreach 遍历序列中所有元素 val arr:Array[Int] =Array(1,2,3,4,1) arr.foreach(println) //结果 1 2 3 4 1 apply 根据下标提取指定元素,存在下标越界异常 var arr1=Array(2,4,7,3,9) println(arr1.apply(2)) //结果 7 a 阅读详情

对scala中的集合类虽然有使用,但是一直处于一知半解的状态。尤其是与java中各种集合类的混合使用,虽然用过很多次,但是一直也没有做比较深入的了解与分析。正好趁着最近项目的需要,加上稍微有点时间,特意多花了一点时间对scala中的集合类做个详细的总结。

1.数组Array

在说集合类之前,先看看scala中的数组。与Java中不同的是,Scala中没有数组这一种类型。在Scala中,Array类的功能就与数组类似。 
与所有数组一样,Array的长度不可变,里面的数据可以按索引位置访问。

  def test() = {
    val array1 = new Array[Int](5)
    array1(1) = 1
    println(array1(1))
    val array2 = Array(0, 1, 2, 3, 4)
    println(array2(3))
  }

上面的demo就演示了Array的简单用法。

2.集合类的大致结构

盗用网上的一张图,scala中集合类的大体框架如下图所示。 
这里写图片描述

特意查了下scala的源码,贴上几张图,可以对应到上面的这幅继承关系图。 
这里写图片描述

根据图以及源码可以很清晰地看出scala中的集合类可以分为三大类: 
1.Seq,是一组有序的元素。 
2.Set,是一组没有重复元素的集合。 
3.Map,是一组k-v对。

3.Seq分析

Seq主要由两部分组成:IndexedSeq与LinearSeq。现在我们简单看下这两种类型。

首先看IndexedSeq,很容易看出来这种类型的主要访问方式是通过索引,默认的实现方式为vector。

  def test() = {
    val x = IndexedSeq(1,2,3)
    println(x.getClass)
    println(x(0))

    val y = Range(1, 5)
    println(y)
  }

将以上函数运行起来以后,输出如下:

class scala.collection.immutable.Vector
1
Range(1, 2, 3, 4)

而作为LinearSeq,主要的区别在于其被分为头与尾两部分。其中,头是容器内的第一个元素,尾是除了头元素以外剩余的其他所有元素。LinearSeq默认的实现是List。

  def test() = {
    val x = collection.immutable.LinearSeq("a", "b", "c")
    val head = x.head
    println(s"head is: $head")

    val y = x.tail
    println(s"tail of y is: $y")
  }

将上面的代码运行起来以后,得到的结果如下:

head is: a
tail of y is: List(b, c)

4.Set

与其他任何一种编程语言一样,Scala中的Set集合类具有如下特点: 
1.不存在有重复的元素。 
2.集合中的元素是无序的。换句话说,不能以索引的方式访问集合中的元素。 
3.判断某一个元素在集合中比Seq类型的集合要快。

Scala中的集合分为可变与不可变两种,对于Set类型自然也是如此。先来看看示例代码:

  def test() = {
    val x = immutable.HashSet[String]("a","c","b")
    //x.add("d")无法使用,因为是不可变集合,没有add方法。
    val y = x + "d" + "f"  // 增加新的元素,生成一个新的集合
    val z = y - "a"  // 删除一个元素,生成一个新的集合
    val a = Set(1,2,3)
    val b = Set(1,4,5)
    val c = a ++ b  // 生成一个新的集合,增加集合
    val d = a -- b  // 生成一个新的集合,去除集合
    val e = a & b // 与操作
    val f = a | b // 或操作
  }

因为上面代码里的集合类型都是不可变类型,所以所有语句结果其实都是生成一个新的集合。

  def test() = {
    val x = new mutable.HashSet[String]()
    x += "a"  // 添加一个新的元素。注意此时没有生成一个新的集合
    x.add("d") //因为是可变集合,所以有add方法
    x ++= Set("b", "c")  // 添加一个新的集合
    x.foreach(each => println(each))
    x -= "b"  // 删除一个元素
    println()
    x.foreach(each => println(each))
    println()
    val flag = x.contains("a") // 是否包含元素
    println(flag)
  }

将上面这段代码运行起来以后,得到的结果如下:

c
d
a
b

c
d
a

true

5.Map

Map这种数据结构是日常开发中使用非常频繁的一种数据结构。Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的。 默认情况下,我们可以通过Map直接创建一个不可变的Map容器对象,这时候容器中的内容是不能改变的。示例代码如下。

  def test() = {
    val peoples = Map("john" -> 19, "Tracy" -> 18, "Lily" -> 20) //不可变
    // people.put("lucy",15) 会出错,因为是不可变集合。
    //遍历方式1
    for(p <- peoples) {
      print(p + "  ") // (john,19)  (Tracy,18)  (Lily,20)
    }
    //遍历方式2
    peoples.foreach(x => {val (k, v) = x; print(k + ":" + v + "  ")}) //john:19  Tracy:18  Lily:20
    //遍历方式3
    peoples.foreach ({ case(k, v) => print(s"key: $k, value: $v  ")})
    //key: john, value: 19  key: Tracy, value: 18  key: Lily, value: 20
  }

上面代码中的hashMap是不可变类型。 
如果要使用可变类型的map,可以使用mutable包中的map相关类。

  def test() = {
    val map = new mutable.HashMap[String, Int]()
    map.put("john", 19) // 因为是可变集合,所以可以put
    map.put("Tracy", 18)
    map.contains("Lily") //false
    val res = getSome(map.get("john"))
    println(res) //Some(19)
  }

  def getSome(x:Option[Int]) : Any = {
    x match {
      case Some(s) => s
      case None => "None"
    }
  }

6.可变数组ArrayBuffer

特意将ArrayBuffer单独拎出来,是因为ArrayBuffer类似于Java中的ArrayList。而ArrayList在Java中是用得非常多的一种集合类。 
ArrayBuffer与ArrayList不一样的地方在于,ArrayBuffer的长度是可变的。与Array一样,元素有先后之分,可以重复,可以随机访问,但是插入的效率不高。

  •  

7.java与scala集合的相互转换

scala最大的优势之一就是可以使用JDK上面的海量类库。实际项目中,经常需要在java集合类与scala集合类之间做转化。具体的转换对应关系如下: 
scala.collection.Iterable <=> Java.lang.Iterable 
scala.collection.Iterable <=> Java.util.Collection 
scala.collection.Iterator <=> java.util.{ Iterator, Enumeration } 
scala.collection.mutable.Buffer <=> java.util.List 
scala.collection.mutable.Set <=> java.util.Set 
scala.collection.mutable.Map <=> java.util.{ Map, Dictionary } 
scala.collection.mutable.ConcurrentMap <=> java.util.concurrent.ConcurrentMap

scala.collection.Seq => java.util.List 
scala.collection.mutable.Seq => java.util.List 
scala.collection.Set => java.util.Set 
scala.collection.Map => java.util.Map 
java.util.Properties => scala.collection.mutable.Map[String, String]

在使用这些转换的时候,只需要scala文件中引入scala.collection.JavaConversions._ 即可。

一般比较多件的场景是在scala中调用java方法。如前面所讲,jdk的类库太丰富了,在scala中会经常有调用java方法的需求。给个简单的例子: 
假设有如下java代码:

public class TestForScala {

    public static <T> void printCollection(List<T> list) {
        for(T t: list) {
            System.out.println(t);
        }
    }
}

我们想在scala代码中调用TestForScala类中的printCollection方法。可以这么写:

  def test() = {
    val raw = Vector(1, 2, 3)
    TestForScala.printCollection(raw)
  }

java方法中需要的参数是个List,参照我们前面的转换关系,scala.collection.Seq可以自动转化为java中的List,而Vector就是scala中Seq的实现,所以可以直接传入到printCollection方法中!

Scala中集合的使用 本关任务:连接两个列表并对数据去重。本关任务:统计各单词出现的次数。本关任务:求出两个集合的交集。 阅读详情

相关推荐

西门子1500 PLC与巴鲁夫RFID实战:从硬件接线到数据读写的完整流程

本文详细介绍了西门子S7-1500 PLC与巴鲁夫RFID系统集成的完整实战流程。内容涵盖从硬件选型、接线、PROFINET网络配置,到在TIA Portal中安装GSD文件、组态设备、分配地址,再到使用标准功能块(如FB31)进行程序架构设计、实现数据读写以及错误诊断。文章重点分享了硬件连接要点、软件配置步骤、数据块管理技巧以及调试中常见问题的解决方案,为工业自动化工程师实施RFID项目提供了清晰的指导。

weixin_29161785的博客 385

Scala集合常用方法

迭代遍历集合中的每个元素,对每个元素进行处理 ,但是,常用于打印结果数据!适用于任意集合注意Map集合的用法:map函数遍历每个元素处理返回原集合类型的新集合 , 也可以不返回数据列表,数组,Map中都有map函数 元组中没有map函数适用于: 数组 List Mapfilter返回符合自己条件的新的集合,filterNot返回不符合自己条件的新的集合每个元素进行过滤多条件filter进行条件过滤连续使用多次filter进行条件过滤常用于: Array List Map。

weixin_71214112的博客 727

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

scala 中的集合操作

在 for 循环中,yield 可以将循环中每个元素转换为集合中的一个元素,并返回一个新的、包含这些元素的集合。将一个可迭代的集合与另一个可迭代的集合组合成一对一对应的元素,并返回一个新的可迭代的集合。包含由该可迭代集合和that的对应元素组成的一对的新的可迭代集合。返回的集合的长度是该可迭代集合和that长度的最小值。map对集合中的每个元素使用匿名函数处理,并将返回值组会成一个新的集合。对每个元素都应用f,于map的区别是,不返回新的集合。B - 返回的一对中的第二部分的类型。unzip于zip相反。

weixin_44020424的博客 244

基于STM32的智能循迹小车设计(基础版)

基于STM32的智能循迹小车设计 硬件准备 1、小车底盘+四直流电机(带轮) 2、STM32F103C8T6核心板 3、12V 8700mAh锂电池(可以用几节18650锂电池) 4、循迹模块 选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用 5、L298N电机驱动模块 四驱车为啥用L298N电机驱动模块? 可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。 12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心

Rendezvous1的博客 3万+

[OrCad电路板设计系统].Orcad.Pspice.9.2下载安装

Orcad.Pspice.9.2详细下载安装图文步骤1 安装前准备工作1.1 下载安装包1.2 解压2 安装时步骤2.1 安装文件2.2 破解文件3 安装完成 1 安装前准备工作 1.1 下载安装包 打开百度网盘APP 链接:https://pan.baidu.com/s/1cMFxHUvuh5iEhFVT-lvciQ 提取码:7m65 1.2 解压 解压下载好的安装包 2 安装时步骤 2.1 安装文件 1.点击Setup安装文件,出现警告对话框,告诉你应该关闭所有病毒防火墙,点击确定 2.进入安装界面,

weixin_48924581的博客 1万+

scala集合类详解

对scala中的集合类虽然有使用,但是一直处于一知半解的状态。尤其是与java中各种集合类的混合使用,虽然用过很多次,但是一直也没有做比较深入的了解与分析。正好趁着最近项目的需要,加上稍微有点时间,特意多花了一点时间对scala中的集合类做个详细的总结。 1.数组Array 在说集合类之前,先看看scala中的数组。与Java中不同的是,Scala中没有数组这一种类型。在Scala中,Arra...

默默前行,勿喜、勿悲、一切随缘! 498

利用autojs制作抢购支付宝消费劵的手机脚本

前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ...

洛阳泰山的博客 1万+

【Scala学习】之SCALA 集合类

文章目录SCALA COLLECTIONSThe main Scala collections classesTHE ARRAYBUFFER CLASSMore ways to work with `ArrayBuffer`THE LIST CLASSCreating ListsAdding elements to a ListHow to remember the method namesHow to loop over listsA little bit of historyTHE VECTOR CLA

有问题的请私信或关注v【技术印记】留言 526

瑞芯微RK3588部署YOLOv8模型

写下这篇博客进行记录,以防后面忘了怎么部署。

weixin_45303602的博客 3648

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1326

Scala——Scala中的集合;数组Array与集合类List的使用

Scala中集合 在Scala语言中,数组Array或者集合类(List,Set ,Map)分为可变集合和不可变集合2类 第一类:Array 和List 不可变的类名称:Array和List 可变的类名称:ArrayBuffer和ListBuffer 第二类:set和Map 可变还是不可变名称都是set或map,变化的包的名称 可变:mutable import scala.coll...

蚂蚁 1917

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1020

Scala集合类详解

对scala中的集合类虽然有使用,但是一直处于一知半解的状态。尤其是与java中各种集合类的混合使用,虽然用过很多次,但是一直也没有做比较深入的了解与分析。正好趁着最近项目的需要,加上稍微有点时间,特意多花了一点时间对scala中的集合类做个详细的总结。 1.数组Array 在说集合类之前,先看看scala中的数组。与Java中不同的是,Scala中没有数组这一种类型。在Scala中,Arra...

weixin_30500105的博客 114

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Scala集合类上的高阶方法

Scala集合的真正强大之处在于带来了其高阶方法。一个高阶方法使用一个函数作为其输入参数。需要特别注意的是,一个高阶方法并不改变集合。下面是Scala集合的一些最主要的高阶方法。

2403_87257611的博客 720

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

五, Scala常见集合类总结(Array, List, Set, Map)

五, Scala常见集合类总结(Array, List, Set, Map) 5.1 Scala集合概述 Scala 的集合有三大类: 序列seq, 集Set, 映射Map, 所有的集合都扩展自 Iterable 特质; 对于几乎所有的集合类, Scala都同时提供了可变和不可变的版本. 分别位于以下两个包: scala.collection.immutable, scala.collection.mutable Q:什么是可变,不可变集合? a. Scala 不可变集合, 就是指该集合对象不可修

菜菜的大数据开发の路 2027

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Scala集合类

import scala.collection.mutable.ArrayBuffer /** 学习Scala的集合类型,常用的包含: Array,List,Set,Map,Tuple 本节是学习Array的声明,使用和重要的方法 **/ object Demo04 { println("Welcome to th...

xianrenqiu1234的博客 228

【Scala笔记——道】Scala 循环遍历 for详解

Scala for循环 基本使用 增强型for循环 scala基本for循环如下,代码将names遍历并打印包含的名字。 val names = Seq(&quot;Kitty&quot;, &quot;Tom&quot;, &quot;Luke&quot;, &quot;Kit&quot;) for (name &amp;lt;- names) { println(name) } 相较Java,语法层面

Contributor -> Committer 1万+

Scala 集合类

这个章节的内容包含 基本数据结构 List Set Tuple Maps 函数组合器 map foreach filter zip partition find drop and dropWhile foldRight and foldLeft flatten flatMap 广义的函数组合器 如何处理好Map? 基

lantian0802的专栏 1155

scala集合

Scala 集合类系统地区分了可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。 所有的集合类都可以在包scala.collection或scala.collection.mutab...

老猿说说专栏 169

Scala混用Java的集合类调用scala的foreach遍历问题

Scala混用Java的集合类调用scala的foreach遍历问题问题描述原因分析解决方案 问题描述 [ERROR] /Users/jack/book/lightsword/src/main/scala/com/springboot/in/action/service/LightSwordUserDetailService.scala:31: error: value foreach is not a member of java.util.List[com.springboot.in.action.en

一个写湿的程序猿 671

Scala系列6:Scala中Array,BufferArray,元组,list,set,map等集合使用详解

Scala中集合类的序列有:数组,元组,列表,Set集,Map映射,其中数组,列表,Set,Map又分为可变和不可变两种。下面就此详细展开介绍使用。 0.数组的使用详解 scala中数组的概念是和Java类似,可以用数组来存放一组数据。scala中,有两种数组,一种是定长数组,另一种是变长数组。 0.1 定长数组 定长数组指的是数组的长度是不允许改变的。通过指定长度定义数组,语法格式如下: val/var 变量名 = new Array[元素类型](数组长度) //方式1:通过指定...

涤生大数据 2625

Scala中的集合

如果你是从Java 转来Scala的,你最好忘记Java集合类的使用方法,然后用Scala集合类所希望的方式来使用Scala集合。就像本书的一个作者说的,“就我个人经验来说,当我刚开始用Scala工作时,我试着去用Java集合类在我的Scala代码里,但慢慢的这样做会拖慢我的工作进展。” 主要的Scala集合类 你会经常使用到的Scala集合类有: Class Description ArrayBuffer 一个索引的可变序列 List 一个线性的(链表)不可变序列 Vector 一

weixin_40544320的博客 361

Scala学习感想

Scala学习笔记总结

New World 3186
上一篇: Spark之线性回归分析
下一篇: 互信息的深度理解(总结的不错值得一看)
那记忆微凉
博客等级 码龄9年 412粉丝 387原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值