Scala集合常用函数 - 高级计算函数

水善利万物而不争,处众人之所恶,故几于道💦

目录

  1. 过滤 - filter
  2. 转换/映射 - map
  3. 扁平化 - flatten
  4. 扁平化+映射 - flatMap
  5. 分组 - groupBy
  6. 简化(规约) - reduce
  7. 折叠 - fold
  8. 函数小练习

1. 过滤 - filter

 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
//对List集合进行遍历,将偶数取出,放到新的集合中去val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)println(list.filter((a: Int) => {a % 2 == 0}))println(list.filter(_ % 2 == 0))

  filter()方法的参数是一个函数类型,其返回值为布尔类型,函数体指明过滤的规则。

2. 转换/映射 - map

 将集合中的每一个元素映射到某一个函数
//将集合中的元素进行乘2操作
println(list.map(_ * 2))

3. 扁平化 - flatten

flatten函数用于将嵌套的集合展平为一个单层的集合。它将嵌套的集合中的元素取出来,放入一个新的集合中。

flatten函数只对嵌套的集合有效,如果集合中的元素不是集合类型,则flatten函数不会有任何效果

注意: :::操作符用于连接两个集合,它将两个集合合并成一个新的集合。它接受右侧的集合作为参数,并将其添加到左侧的集合之后。而flatten函数用于将嵌套的集合展平为一个单层的集合。它们的功能和用途是不同的

val list1 = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
val newList1: List[Int] = list1.flatten
println(newList1)结果:
List(1, 2, 3, 4, 5, 6, 7, 8, 9)

4. 扁平化+映射 - flatMap

flatMap相当于先进行map操作,再进行flatten操作
val strings = List("hello atguigu", "hello jingjing", "qcln jingjing")//常规实现
val stringses: List[Array[String]] = strings.map(_.split(" "))
println(stringses.flatten)// 使用flatMap函数实现
val strings2: List[String] = strings.flatMap(_.split(" "))
println(strings2)

5. 分组 - groupBy

 按照指定的规则对集合的元素进行分组

val nameList = List("jingjing", "banzhang", "banhua", "anqcln", "jinghua")// 按元素首字母进行分组
val charToStrings: Map[Char, List[String]] = nameList.groupBy(_.charAt(0))
println(charToStrings)结果:
Map(b -> List(banzhang, banhua), j -> List(jingjing, jinghua), a -> List(anqcln))

进阶:修改分组后key的值
  直接再进行一次map映射

// 将分组后key的值改为大写
val keyStyle1: immutable.Iterable[String] = charToStrings.map(MapKv => {val upperKey: Char = MapKv._1.toUpperupperKey + " -- " + MapKv._2})
println(keyStyle1)// 将分组后key为b的值改为X
val keyStyle2: immutable.Iterable[String] = charToStrings.map(MapKV => {val newKey = if (MapKV._1.equals('b')) 'X' else MapKV._1newKey + " -- " + MapKV._2
})
println(keyStyle2)

  说明:Scala中if条件判断其实是有返回值的,返回值取决于满足条件的代码体的最后一行内容。

6. 简化(规约) - reduce

 通过指定的逻辑将集合中的数据进行聚合,从而减少数据,最终获取结果

reduce:底层调用的是reduceLeft。他要求传入的两个参数的类型必须一致,返回值也是该类型。

reduceLeft:传入的两个参数的参数类型可以不一致。它从集合左边开始做聚合,返回值类型是左边的类型。

reduceRight:传入的两个参数的参数类型可以不一致。它从集合右边开始做聚合,返回值类型是右边的类型。

val list = List(1, 2, 3, 4)val res: Int = list.reduce(_ + _)
val res: Int = list.reduceLeft(_ + _)
val res: Int = list.reduceRight(_ + _)
println(res)println(list.reduceLeft(_ - _))  // -8
println(list.reduceRight(_ - _))  // -2val list2: List[Int] = List(3, 4, 5, 8, 10)
println(list2.reduceRight(_ - _))   // 6

reduceLeft:从左边开始简化,用第一个元素减去第二个元素,然后再用结果减去第三个元素

reduceRight:从右边开始简化,用倒数第二个元素减去倒数第一个元素,再用倒数第三个元素减去上一个结果

从源码角度理解reduceRight的计算方法

7. 折叠 - fold

 简化的一种特殊情况,它是集合外元素和集合内部元素进行聚合。计算方式和简化相似。

val list2: List[Int] = List(3, 4, 5, 8, 10)  println(list2.fold(10)(_+_))  // 40println(list2.foldLeft(11)(_ - _))  // -19println(list2.foldRight(12)(_ - _))   // -6

foldLeft:从左边开始折叠,用集合外的元素减去集合左边第一个元素,再用结果减去第二个元素,以此类推

foldRight:从右边开始折叠,用集合最后一个元素减去集合外的元素,再用集合倒数第二个元素减去结果,以此类推


8. 函数小练习

将两个map集合中的数据合并(key相同的话,value相加)

val map1 = mutable.Map("a"->1, "b"->2, "c"->3)
val map2 = mutable.Map("a"->4, "b"->5, "d"->6)//方法一   
// map1("e") = 9 这样也能添加元素....
val res: mutable.Map[String, Int] = map1.foldLeft(map2)(// m2Jh表示map2,m1表示map1中的每一个元素(m2Jh, m1) => {// 指定合并的规则val m1Key: String = m1._1val m1Value: Int = m1._2// 根据map1中元素的key更新map2中的value,或者直接添加m2Jh(m1Key) = m2Jh.getOrElse(m1Key, 0) + m1Value m2Jh})//  ================================== 方法二 ================================= 
// 我写的,通俗易懂
val res: mutable.Map[String, Int] = map1.foldLeft(map2)((m2Jh, m1) => {val m1Key: String = m1._1val m1Value: Int = m1._2// 在map2中获取value,如果获取到,执行update更新value,如果获取不到执行put添加val flag: Int = m2Jh.getOrElse(m1Key, 0)  if(flag==0){m2Jh.put(m1Key,m1Value)}else{m2Jh.update(m1Key,m1Value+flag)}m2Jh  // 将map2集合返回,因为foldLeft()()的参数类型就要求的
})println(res)

分析:

  两个集合合并,涉及到两个集合,用折叠fold

  折叠有三个,具体选哪个,fold要求集合外部元素类型和集合内部元素类型一致,foldLeftfoldRight可以不一致,这两个集合合并的话,明显类型不一致,因为方法调用的时候把其中一个map集合整体作为参数传了进去,这个参数类型是map,而方法调用者是一个map集合,内部元素的类型是一个元组,这一个元组,一个map类型明显不一致,所以不能用fold,那就用foldLeft得了,简单。

  最后合并的思路是什么? 把其中一个map集合作为参数传递进去,然后再迭代另一个集合的时候取到key和value判断,如果这个key在集合中存在,那么更新它的value,如果这个key在集合中不存在,将这个key和value加入到这个集合中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APACHE KAFKA本机Hello World教程

目标 最近想要简单了解一下Apache Kafka,故需要在本机简单打个Kafka弄一弄Hello World级别的步骤。 高手Kafka大佬们,请忽略这里的内容。 步骤 Apacha Kafka要求按照Javak8以上版本的环境。从官网下载kafka并解压。 启动 # 生产kafka集群随机ID KA…

【MySQL】 如何在MySQL中获取表中的某个字段为最大值和倒数第二条的整条数据?

文章目录 前言一、查询倒数第二个记录1.1、使用排名1.2、子查询1.3、嵌套查询 二、下面为大家提供一个测试案例三、查询某个字段为最大值的整条数据3.1、使用max3.2、使用连接3.3、前n个最大(最小)值 四、使用组合查询,先查询到最小的价格是多…

未来Mac下载站怎么打不开了

重要公告: 未来软件园因业务需要现更换域名 原域名:Mac.orsoon.com 更为新域名:未来mac下载-Mac软件-mac软件下载-mac软件大全 程序已全面转移,请访问新域名

软件基础问答题

性能: 负载压力测试是指在一定约束条件下测试系统所能承受的并发用户量、运行时间、数据量等,以确定系统所能承受的最大负载压力。 负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下&#xf…

校园跑腿小程序怎么样?

随着社会的发展和人们生活水平的提高,高等教育越来越受到重视。大学校园不仅是学习的地方,也是学生们日常生活的场所。然而,在繁忙的学业和生活压力下,学生可能经常面临诸如代购、快递、取餐等各种琐碎但繁琐的任务。基于这个需求…

PHP中的支持向量机算法实现原理

PHP中的支持向量机算法实现原理 支持向量机(Support Vector Machine,简称SVM)是一种常用的机器学习算法,用于进行分类和回归分析。它基于统计学习理论和结构风险最小化原则,通过构造最优分类超平面来实现模型训练和预…

【技能实训】DMS数据挖掘项目-Day11

文章目录 任务12【任务12.1】创建用户信息表【任务12.2】在com.qst.dms.entity下创建用户实体类User,以便封装用户数据【任务12.3】在com.qst.dms.service下创建用户业务类UserService【任务12.4】在项目根目录下创建图片文件夹images,存储dms.png【任务…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列一

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于requests多线程…

SQL 训练题目

title: SQL 训练题目 date: 2023-7-15 01:45:50 tags:- SQL 训练 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数 解题思路:要查询的是两个课程的成绩,而且还要显示学生的信息。所以需要用到两张表,SC&#xf…

微信小程序——字符串截取

indexOf() : 判断一个字符是否在字符串 中 存在,如果存在返回该元素或字符第一次出现 的 位置 的 索引,不存在返回-1。 lastIndexOf() : 返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。…

2.5 vim的使用

2.5 Vim的使用 介绍 Vim是一款强大的文本编辑器,常用于在终端环境下编辑文本文件。本文将介绍Vim的基本概念、常用操作和一些实用技巧,帮助您更高效地使用Vim进行文本编辑。 Vim的基本模式 Vim具有多种模式,其中最常用的三种模式是&#…

DuiLib的基本框架的中的函数解析

文章目录 1、duilib的简介2、基本的框架窗口3、框架的剖析3.1、创建窗口类3.2、注册窗口类3.3、创建窗口3.4、显示窗口3.5、消息循环3.6、回调函数 4、总结 1、duilib的简介 国内首个开源 的directui 界面库,它提供了一个所见即所得的开发工具——UIDesigner,它只有…

C#对中文进行URL编码

背景 有时候需要用C#编写爬虫,http链接里带有中文参数,需要进行转换再提交请求 方案 使用.Net6的话,里边有这个类 System.Web.HttpUtility 它提供了静态方法 public static string? UrlEncode (string? str, System.Text.Encoding e…

静态数码管显示

学习芯片: EP4CE6F17C8 本次学习使用的为共阴极数码管,即用低电平点亮数码管,同样可知,共阳极数码管的阳极连在一起,即用高电平点亮数码管。 八段数码管示意图: a,b,c,d,e,f,g,dg表示八段数码管时&#…

7、sentinel使用和源码分析

一、分布式系统遇到的问题 1、服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待&#x…

力扣 135. 分发糖果

题目来源:https://leetcode.cn/problems/candy/description/ C题解(来源代码随想录): 先从左往右比较,右边孩子评分比左边高就多发1颗糖,否则就只发1颗;再从右往左比较,左边孩子评分…

MySQL——day4

单表查询练习 -- 1. 查询出部门编号为30的所有员工 mysql> select * from emp where deptno30; -- 2. 所有销售员的姓名、编号和部门编号。 mysql> select ename,empno,deptno from emp where job销售员; -- 3. 找出奖金高于工资的员工。 mysql> select * from em…

机械臂的雅克比矩阵推导

1. 线速度和角速度的递推通式推导 p i p i − 1 R i − 1 r i − 1 , i i − 1 \mathbf{p}_{i}\mathbf{p}_{i-1}\mathbf{R}_{i-1} \mathbf{r}_{i-1, i}^{i-1} pi​pi−1​Ri−1​ri−1,ii−1​ p i − 1 \mathbf{p}_{i-1} pi−1​是 { i − 1 } \{i-1\} {i−1}坐标系的原点的…

记一次ruoyi中使用Quartz实现定时任务

一、首先了解一下Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标…

PostgreSQL学习总结(13)—— PostgreSQL 目录结构与配置文件 postgresql.conf 详解

环境搭建完成后,从环境变量里看它涉及的目录 export PGHOME/usr/local/pgsql/ export PGUSERpostgres export PGPORT5432 export PGDATA/app/pgsql/data export PGLOG/app/pgsql/log/postgres.log export PATH$PGHOME/bin:$PATH:$HOME/bin export LD_LIBRARY_PATH$…