当前位置: 首页 > news >正文

Scala的高级用法

文章目录

  • 1. 默认参数值
    • 1.1 方法默认参数
    • 1.2 类默认参数
  • 2. 特质 (Traits)
    • 2.1 子类型
    • 2.2 扩展特征,当做接口来使用
  • 3.元组
    • 3.1 定义与取值
    • 3.2 元组用于模式匹配
    • 3.3 用于for循环
  • 4 高阶函数
    • 4.1 常见的高阶函数map
    • 4.2 简化涨薪策略代码
  • 5.嵌套方法
  • 6.多参数列表(柯里化)
  • 7.模式匹配
    • 7.1 简单的模式匹配
  • 8.隐式转换
    • 8.1 官网的列子

1. 默认参数值

1.1 方法默认参数

  def main(args: Array[String]): Unit = {//定义打印日志方法def log(date:Date,msg:String,level:String="Info"): Unit ={println(s"$date  $level $msg")}log(new Date,"你好");log(new Date(),"你好","Info");log(new Date(),"错误信息","Error");}

默认值顺序在中间的调用加上命名参数才能调用,否则报错

def log(date:Date,level:String="Info",msg:String): Unit ={println(s"$date  $level $msg")}log(new Date,msg="你好");

1.2 类默认参数

 def main(args: Array[String]): Unit = {val point1 = new Point(y = 1)point1.printLocation()}class Point(val x: Double = 0, val y: Double = 0){def printLocation(): Unit ={print(s"x=$x  $y")}}

2. 特质 (Traits)

用于在类 (Class)之间共享程序接口 (Interface)和字段 (Fields)。 它们类似于Java 8的接口。 类和对象 (Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。

2.1 子类型

trait Animal {def say(): Unit ={println("animal say....")}def walk(): Unit ={println("animal walk....")}
}
//cat 继承animal
class Cat extends Animal{def miaomiao(): Unit ={println("car miaomiao...")}
}def main(args: Array[String]): Unit = {val cat=new Cat()cat.miaomiao()cat.walk()cat.say()
}
// car miaomiao...
//animal walk....
//animal say....

2.2 扩展特征,当做接口来使用

//定义迭代器 使用泛型Ttrait Iterator[T] {def hasNext: Booleandef next(): T}//自定义实现的Int类型的迭代器class IntIterator(to: Int) extends Iterator[Int] {private var current = 0override def hasNext: Boolean = current < tooverride def next(): Int =  {if (hasNext) {val t = currentcurrent += 1t} else 0}}def main(args: Array[String]): Unit = {val intIterator = new IntIterator(5)while(intIterator.hasNext){println(intIterator.next())}
//    0
//    1
//    2
//    3
//    4

3.元组

元组是一个可以包含不同类型元素的类,元组是不可变的。
经常用于函数返回多个值。
元组包含2-22给个元素之间。

3.1 定义与取值

 def main(args: Array[String]): Unit = {val t1 = Tuple1(1)//访问元素println(t1._1)val t2 = new Tuple1("asdas")println(t2._1)//也可以直接括号val t3=("as",12,false)//指定类型val t4=("as",12,true,0.88):Tuple4[String,Int,Boolean,Double]}

3.2 元组用于模式匹配

def main(args: Array[String]): Unit = {val courseScores = List(("Chinese", 77), ("Math", 100), ("Geo", 0 ),("English", 55 ))//遍历courseScores.foreach{ tuple => {tuple match {case p if(p._2 == 100) => println(s" ${p._1} score is 100")case p if(p._2 > 60 ) => println(s" ${p._1} score is greater than 60")case p if(p._2 == 0) => println(s" ${p._1} score is o")case _ => println(s"不及格")}}}

3.3 用于for循环

def main(args: Array[String]): Unit = {val numPairs = List((2, 5), (3, -7), (20, 56))for ((a, b) <- numPairs) {println(a * b)}///10//-21//1120}

4 高阶函数

使用函数来作为参数或则返回结果。

4.1 常见的高阶函数map

  def main(args: Array[String]): Unit = {var seqno = Seq(1,2,3)val values = seqno.map(x => x * x)for ( x <- values ){println(x )}
//    1
//    4
//    9}

4.2 简化涨薪策略代码

 //定义加薪的规则def smallPromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * 1.2)//薪资的def greatPromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * math.log(salary))//薪资def hugePromotion(salaries: List[Double]): List[Double] =salaries.map(salary => salary * salary)}

去掉重复代码,定义一个方法接口,涨薪的规则传入函数

  def promotion(salaries: List[Double], promotionFunction: Double => Double): List[Double] = {salaries.map(promotionFunction)}

测试

val salaries = List(2500.00,3000.00,4000.00)//实现涨薪var newsalaries= promotion(salaries,(x:Double) => x* 1.2)for(s <- newsalaries){print(s"$s ")//3000.0 3600.0 4800.0}println()println("-----------------------------")println()var newsalaries2= promotion(salaries,(x:Double) => x* x)for(s <- newsalaries2){print(s"$s ")//6250000.0 9000000.0 1.6E7 }

5.嵌套方法

嵌套方法经常使用的就是递归调用。
求阶乘

 //定义阶乘def fac(x:Int):Int = {if (x==1) {x}else {x * fac(x-1)}}//24print(fac(4))

6.多参数列表(柯里化)

方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化

def foldLeft[B](z: B)(op: (B, A) => B): B = {var acc = zvar these: LinearSeq[A] = collwhile (!these.isEmpty) {acc = op(acc, these.head)these = these.tail}acc}

测试

 val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val res = numbers.foldLeft(0)((m, n) => m + n)print(res) // 55

7.模式匹配

7.1 简单的模式匹配

def main(args: Array[String]): Unit = {val x: Int = Random.nextInt(5)val str = x match {case 0 => "zero"case 1 => "one"case 2 => "two"case _ => "other"}println(str)}

8.隐式转换

方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。

8.1 官网的列子

//定义一个抽象类,提供两个方法一个add 一个unitabstract class Monoid[A] {def add(x: A, y: A): Adef unit: A}//隐式实现字符串的拼接implicit val stringMonoid: Monoid[String] = new Monoid[String] {def add(x: String, y: String): String = x concat ydef unit: String = ""}//隐式实现整型的数字相加implicit val intMonoid: Monoid[Int] = new Monoid[Int] {def add(x: Int, y: Int): Int = x + ydef unit: Int = 0}//传入一个list实现不同类型的累加def sum[A](xs: List[A])(implicit m: Monoid[A]): A =if (xs.isEmpty) m.unitelse m.add(xs.head, sum(xs.tail))println(sum(List(1, 2, 3)))       // 6println(sum(List("a", "b", "c"))) //abc

完结,其他的可以到官网看看,用到在学。

相关文章:

Scala的高级用法

文章目录 1. 默认参数值1.1 方法默认参数1.2 类默认参数 2. 特质 (Traits)2.1 子类型2.2 扩展特征&#xff0c;当做接口来使用 3.元组3.1 定义与取值3.2 元组用于模式匹配3.3 用于for循环 4 高阶函数4.1 常见的高阶函数map4.2 简化涨薪策略代码 5.嵌套方法6.多参数列表&#xf…...

【31.在排序数组中查找元素的第一个和最后一个位置】

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…...

如何构建“Buy Me a Coffee”DeFi dApp

&#x1f978; 本教程来自官网&#xff1a;https://docs.alchemy.com/docs。对原文部分内容进行了修改。教程中所有实例经过本人实践&#xff0c;代码可见&#xff1a;https://github.com/ChuXiaoYi/web3Study 区块链技术令人惊叹&#xff0c;因为它使我们能够使用代码和软件编…...

Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

目录 二值状态统计判断用户登陆态SETBIT 命令GETBIT 命令第一步&#xff0c;执行以下指令&#xff0c;表示用户已登录。第二步&#xff0c;检查该用户是否登陆&#xff0c;返回值 1 表示已登录。第三步&#xff0c;登出&#xff0c;将 offset 对应的 value 设置成 0。 用户每个…...

3 天,入门 TAURI 并开发一个跨平台 ChatGPT 客户端

TAURI 是什么 TAURI 是一个使用 Rust 编写的程序框架&#xff0c;它允许我们使用 Web 技术和 Rust 语言构建跨端应用。它提供了大量特性&#xff0c;例如系统通知、网络请求、全局快捷键、本地文件处理等&#xff0c;它们都可以在前端通过 JavaScript 便捷的调用。 TAURI 应用…...

14个最佳创业企业WordPress主题

要创建免费网站&#xff1f;从易服客建站平台免费开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 您网站的设计使您能够展示产品的独特卖点。通过正确的主题&#xff0c;您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中&#xff0…...

MySQL基础(三十)PowerDesigner的使用

1 PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具&#xff0c;用户利用该软件可以方便地制作 数据流程图 、概念数据模型 、 物理数据模型&#xff0c;它几乎包括了数据库模型设计的全过程&#xff0c;是Sybase公司为企业建模和设计提供的一套完整的集…...

nginx 服务器总结

一. 负载均衡的作用有哪些&#xff1f; 1、转发功能 按照一定的算法【权重、轮询】&#xff0c;将客户端请求转发到不同应用服务器上&#xff0c;减轻单个服务器压力&#xff0c;提高 系统并发量。 2、故障移除 通过心跳检测的方式&#xff0c;判断应用服务器当前是否可以正常…...

基于Hebb学习的深度学习方法总结

基于Hebb学习的深度学习方法总结 0 引言1 前置知识1.1 Hebb学习规则1.2 Delta学习规则 2 SoftHebb学习算法2.1 WTA(Winner Take All)2.2 SoftHebb2.3 多层Hebb网络2.4 Hebb学习的性能测评 3 参考文献 0 引言 总所周知&#xff0c;反向传播算法&#xff08;back-propagating, B…...

思科模拟器 | 访问控制列表ACL实现网段精准隔绝

文章目录 一、ACL工作原理二、ACL分类初步介绍三、标准ACL1、标准ACL的决策过程2、标通配符掩码关键字3、标准ACL网络拓扑4、标准ACL演示5、实战讲解 四、扩展ACL1、基础语法明细2、扩展ACL示例3、扩展ACL网络拓扑4、实战讲解 五、总结与提炼 一、ACL工作原理 ACL&#xff08;A…...

Python os模块详解

1. 简介 os就是“operating system”的缩写&#xff0c;顾名思义&#xff0c;os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页也可以极大增强代码的可移植性。如果该模块中相…...

Oracle PL/SQL基础语法学习13:比较运算符

系列文章目录 Oracle PL/SQL基础语法学习12&#xff1a;短路求值 Oracle PL/SQL基础语法学习13&#xff1a;比较运算符 Oracle PL/SQL基础语法学习14&#xff1a;BOOLEAN表达式 文章目录 系列文章目录Oracle PL/SQL基础语法学习13&#xff1a;比较运算符比较运算符介绍官方文档…...

金仓数据库适配记录

金仓数据库适配记录 人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。 金仓数据库主要面向事务处理类应用,兼顾各类数据分析类应用,可用做管理信息系统、…...

ElasticSearch 学习 ==ELK== 进阶

二、ElasticSearch 学习 ELK 进阶 &#xff08;1&#xff09;文档局部更新 我们也说过文档是不可变的——它们不能被更改&#xff0c;只能被替换。 update API必须遵循相同的规则。表面看来&#xff0c;我们似乎是局部更新了文档的位置&#xff0c;内部却是像我们之前说的一样…...

【数据结构 -- C语言】 双向带头循环链表的实现

目录 1、双向带头循环链表的介绍 2、双向带头循环链表的接口 3、接口实现 3.1 开辟结点 3.2 创建返回链表的头结点 3.3 判断链表是否为空 3.4 打印 3.5 双向链表查找 3.6 双向链表在pos的前面进行插入 3.6.1 头插 3.6.2 尾插 3.6.3 更新头插、尾插写法 3.7 双向链…...

自然语言处理与其Mix-up数据增强方法报告

自然语言处理与其Mix-up数据增强方法 1绪论1.课题背景与意义1.2国内外研究现状 2 自然语言经典知识简介2.1 贝叶斯算法2.2 最大熵模型2.3神经网络模型 3 Data Augmentation for Neural Machine Translation with Mix-up3.1 数据增强3.2 对于神经机器翻译的软上下文的数据增强3.…...

Vue(组件化编程:非单文件组件、单文件组件)

一、组件化编程 1. 对比传统编写与组件化编程&#xff08;下面两个解释图对比可以直观了解&#xff09; 传统组件编写&#xff1a;不同的HTML引入不同的样式和行为文件 组件方式编写&#xff1a;组件单独&#xff0c;复用率高&#xff08;前提组件拆分十分细致&#xff09; 理…...

【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定

目录 一、问题描述二、算法仿真2.1 BP_PID参数整定初始化2.2 优化PID2.3 绘制图像 三、运行结果四、完整程序 一、问题描述 基于BP神经网络的PID控制的系统结构如下图所示&#xff1a; 考虑仿真对象&#xff0c;输入为r(k)1.0&#xff0c;输入层为4&#xff0c;隐藏层为5&…...

第11章 项目人力资源管理

文章目录 项目人力资源管理 过程11.2.1 编制项目人力资源计划的工具与技术&#xff08;1&#xff09;层次结构图&#xff08;工作、组织、资源 分解结构&#xff09;&#xff08;2&#xff09;矩阵图&#xff08;责任分配矩阵&#xff0c;RAM&#xff09;&#xff08;3&#xf…...

07-Vue技术栈之(组件之间的通信方式)

目录 1、组件的自定义事件1.1 绑定自定义事件&#xff1a;1.1.1 第一种方式1.1.2 第二种方式1.1.3 自定义事件只触发一次 1.2 解绑自定义事件1.3绑定原生DOM事件1.4 总结 2、全局事件总线&#xff08;GlobalEventBus&#xff09;2.1 应用全局事件总线 3、 消息订阅与发布&#…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...