【无标题】Scala函数基础

函数和方法的区别

1) 核心概念

(1) 为完成某一功能的程序语句的集合,称为函数。

(2) 类中的函数称之方法。

2) 案例实操

(1) Scala 语言可以在任何的语法结构中声明任何的语法

(2) 函数没有重载和重写的概念;方法可以进行重载和重写

(3) Scala 中函数可以嵌套定义

object TestFunction {

 

// (2)方法可以进行重载和重写,程序可以执行def main(): Unit = {

 

}

 

def main(args: Array[String]): Unit = {

// (1)Scala 语言可以在任何的语法结构中声明任何的语法

import java.util.Date new Date()

 

// (2)函数没有重载和重写的概念,程序报错def test(): Unit ={

println("无参,无返回值")

}

test()

 

def test(name:String):Unit={ println()

}

 

//(3)Scala 中函数可以嵌套定义

def test2(): Unit ={

5.1.3 函数定义

1) 函数定义

(1) 函数 1:无参,无返回值

(2) 函数 2:无参,有返回值

(3) 函数 3:有参,无返回值

(4) 函数 4:有参,有返回值

(5) 函数 5:多参,无返回值

for {

i <- 1 to 3 j = 4 - i

} {

println("i=" + i + " j=" + j)

}

5.1.4 函数参数

1) 案例实操

(1) 可变参数

(2) 如果参数列表中存在多个参数,那么可变参数一般放置在最后

(3) 参数默认值,一般将有默认值的参数放置在参数列表的后面

(4) 带名参数

object TestFunction {

 

def main(args: Array[String]): Unit = {

 

// (1)可变参数

def test( s : String* ): Unit = { println(s)

}

 

// 有输入参数:输出 Array test("Hello", "Scala")

 

// 无输入参数:输出List() test()

 

// (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后def test2( name : String, s: String* ): Unit = {

println(name + "," + s)

}

 

test2("jinlian", "dalang")

 

// (3)参数默认值

def test3( name : String, age : Int = 30 ): Unit = {

函数至简原则(重点)

函数至简原则:能省则省

1) 至简原则细节

(1) return 可以省略,Scala 会使用函数体的最后一行代码作为返回值

(2) 如果函数体只有一行代码,可以省略花括号

(3) 返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)

(4) 如果有 return,则不能省略返回值类型,必须指定

(5) 如果函数明确声明unit,那么即使函数体中使用 return 关键字也不起作用

(6) Scala 如果期望是无返回值类型,可以省略等号

(7) 如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加

(8) 如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略

(9) 如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

 

高阶函数

在 Scala 中,函数是一等公民。怎么体现的呢? 对于一个函数我们可以:定义函数、调用函数

1) 函数可以作为值进行传递

object TestFunction {

 

def main(args: Array[String]): Unit = {

 

//(1)调用 foo 函数,把返回值给变量f

//val f = foo() val f = foo println(f)

2) 函数可以作为参数进行传递

 

def main(args: Array[String]): Unit = {

 

//(1)定义一个函数,函数参数还是一个函数签名;f 表示函数名称;(Int,Int)表示输入两个 Int 参数;Int 表示函数返回值

def f1(f: (Int, Int) => Int): Int = { f(2, 4)

}

 

// (2)定义一个函数,参数和返回值类型和f1 的输入参数一致

def add(a: Int, b: Int): Int = a + b

 

// (3)将 add 函数作为参数传递给 f1 函数,如果能够推断出来不是调用,_ 可以省略

println(f1(add)) println(f1(add _))

//可以传递匿名函数

}

 

3) 函数可以作为函数返回值返回

 

 

 

def main(args: Array[String]): Unit = { def f1() = {

def f2() = {

 

}

f2 _

}

 

val f = f1()

// 因为f1 函数的返回值依然为函数,所以可以变量f 可以作为函数继续调用

f()

// 上面的代码可以简化为

f1()()

匿名函数
1) 说明

没有名字的函数就是匿名函数。

(x:Int)=>{函数体}

x:表示输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑2)案例实操

需求 1:传递的函数有一个参数传递匿名函数至简原则:

(1) 参数的类型可以省略,会根据形参进行自动的推导
(2) 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过 1 的永远不能省略圆括号。
(3) 匿名函数如果只有一行,则大括号也可以省略

 

(4) 如果参数只出现一次,则参数省略且后面参数可以用_代替
def main(args: Array[String]): Unit = {

 

// (1)定义一个函数:参数包含数据和逻辑函数

def operation(arr: Array[Int], op: Int => Int) = { for (elem <- arr) yield op(elem)

}

 

// (2)定义逻辑函数

def op(ele: Int): Int = { ele + 1

}

 

// (3)标准函数调用

val arr = operation(Array(1, 2, 3, 4), op) println(arr.mkString(","))

 

// (4)采用匿名函数

val arr1 = operation(Array(1, 2, 3, 4), (ele: Int) => { ele + 1

})

 

需求 2:传递的函数有两个参数

 

object TestFunction {

 

def main(args: Array[String]): Unit = {

 

def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int

= {

op(a, b)

}

 

// 1)标准版

println(calculator(2, 3, (x: Int, y: Int) =>{x +y}))

 

// 2)如果只有一行,则大括号也可以省略

println(calculator(2, 3, (x: Int, y: Int) =>x + y))

 

// 3类型参进; println(calculator(2, 3, (x , y) =>x +y))

 

// 4)如果参数只出现一次,则参数省略且后面参数可以用_代替

println(calculator(2, 3, _ + _))

}

}

 

高阶函数案例

需求:模拟 Map 映射、Filter 过滤、Reduce 聚合

 

object TestFunction {

 

def main(args: Array[String]): Unit = {

 

// 1map 映射

def map(arr: Array[Int], op: Int => Int) = { for (elem <- arr) yield op(elem)

}

 

val arr = map(Array(1, 2, 3, 4), (x: Int) => { x * x

})

println(arr.mkString(","))

 

// 2filter 过滤。有参数,且参数再后面只使用一次,则参数省略且后面参数用_表示

def filter(arr:Array[Int],op:Int =>Boolean) ={

var arr1:ArrayBuffer[Int] = ArrayBuffer[Int]() for(elem <- arr if op(elem)){ arr1.append(elem)

}

arr1.toArray

}

var arr1 = filter(Array(1, 2, 3, 4), _ % 2 == 1) println(arr1.mkString(","))

 

// 3reduce 聚合。有多个参数,且每个参数再后面只使用一次,则参数省略且后面参数用_表示,第n _代表第n 个参数

def reduce(arr: Array[Int], op: (Int, Int) => Int) = {

 

var init: Int = arr(0)

 

for (elem <- 1 until arr.length) { init = op(init, elem)

}

init

}

 

//val arr2 = reduce(Array(1, 2, 3, 4), (x, y) => x * y) val arr2 = reduce(Array(1, 2, 3, 4), _ * _) println(arr2)

}

}

 控制抽象

) 值调用:把计算后的值传递过去

 

object TestControl {

def main(args: Array[String]): Unit = { def f = ()=>{

println("f...")

 

 

object TestControl {

def main(args: Array[String]): Unit = { def f = ()=>{

println("f...")

10

}

 

foo(f())

}

 

//def foo(a: Int):Unit = {

def foo(a: =>Int):Unit = {

println(a)

}

}

输出结果:

f... 10 f...

10

 

注意:Java 只有值调用;Scala 既有值调用,又有名调用。

package com.zpark.chapter05 object TestFunctionDeclare {

def main(args: Array[String]): Unit = {

 

// 函数 1:无参,无返回值def test1(): Unit ={

println("无参,无返回值")

}

test1()

 

// 函数 2:无参,有返回值def test2():String={

return "无参,有返回值"

}

println(test2())

 

// 函数 3:有参,无返回值

def test3(s:String):Unit={ println(s)

}

 

test3("scala")

自定义一个 While 循环

 

object TestFunction {

def main(args: Array[String]): Unit = { var i:Int = 1

myWhile(i <= 10){ println(i)

i +=1

}

}

def myWhile(condition: =>Boolean)(op: =>Unit):Unit={ if (condition){

op myWhile(condition)(op)

}

}

}

 

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

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

相关文章

uniapp -- 列表垂直方向拖拽drag组件

背景 需要在小程序中实现拖拽排序功能,所以就用到了m-drag拖拽组件,在开发的过程中,发现该组件在特殊的场景下会有些问题,并对其进行了拓展。 效果 组件代码 <template><!-- 创建一个垂直滚动视图,类名为m-drag --><scroll

conda安装python 遇到 pip is configured with locations that require TLS/SSL问题本质解决方案

以前写了一篇文章&#xff0c;不过不是专门为了解决这个问题的&#xff0c;但是不能访问pip install 不能安装来自https 协议的包问题几乎每次都出现&#xff0c;之前解决方案只是治标不治本 https://blog.csdn.net/wangsenling/article/details/130194456​​​​​​​https…

【初阶数据结构】队列

文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除…

Apache Shiro 全面指南:从入门到高级应用

一、Shiro 概述与核心架构 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一个强大且易用的 Java 安全框架&#xff0c;它提供了认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和会话管…

es 3期 第28节-深入掌握集群组建与集群设置

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…

Android学习总结之通信篇

一、Binder跨进程通信的底层实现细节&#xff08;挂科率35%&#xff09; 高频问题&#xff1a;“Binder如何实现一次跨进程方法调用&#xff1f;”   候选人常见错误&#xff1a;   仅回答“通过Binder驱动传输数据”&#xff0c;缺乏对内存映射和线程调度的描述混淆Binde…

数据结构C语言练习(两个栈实现队列)

一、引言 在数据结构的学习中&#xff0c;我们经常会遇到一些有趣的问题&#xff0c;比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题&#xff0c;详细解析解题思路、代码实现以及每个函数的作用&#xff0c;帮助读者更好地…

前端如何导入谷歌字体库

#谷歌字体库内容丰富&#xff0c;涵盖上千种多语言支持的字体&#xff0c;学习导入谷歌字体库来增加网站的阅读性&#xff0c;是必不可少的一项技能# 1&#xff0c;前往谷歌字体网站 要会魔法&#xff0c;裸连很卡 2&#xff0c; 寻找心仪字体 Googles Fonts下面的filters可…

SnapdragonCamera骁龙相机源码解析

骁龙相机是高通开发的一个测试系统摄像头的demo&#xff0c;代码完善&#xff0c;功能强大。可以配合Camera驱动进行功能联调。 很多逻辑代码在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包罗万象。 涉及到界面显示要结合CaptureUI.java 一起来实现。 Ca…

多线程猜数问题

题目&#xff1a;线程 A 生成随机数&#xff0c;另外两个线程来猜数&#xff0c;线程 A 可以告诉猜的结果是大还是小&#xff0c;两个线程都猜对后&#xff0c;游戏结束&#xff0c;编写代码完成。 一、Semaphore 多个线程可以同时操作同一信号量&#xff0c;由此实现线程同步…

seq2seq

理解 transformer 中的 encoder decoder 详细的 transformer 教程见&#xff1a;【极速版 – 大模型入门到进阶】Transformer 文章目录 &#x1f30a; Encoder: 给一排向量输出另外一排向量&#x1f30a; Encoder vs. Decoder: multi-head attention vs. masked multi-head at…

Proxmox pct 部署ubuntu

pct 前言 PCT(Proxmox Container Tool)是 PVE 中用于管理 Linux 容器(LXC)的命令行工具。通过 PCT,用户可以执行各种容器管理任务,例如创建新的容器、启动和停止容器、更新容器、安装软件包、导出和导入容器等。PCT 提供了与 Web 界面相同的功能,但通过命令行进行操作,…

Google Play关键字优化:关键排名因素与实战策略

如果您准备发布应用程序或开始专注于关键字优化&#xff0c;您可能想知道如何向Google Play上的应用程序添加关键字。Google Play上的搜索量和排名与App Store不同&#xff0c;而且被索引排名的关键字也不同。在此文中&#xff0c;我们将确定Google Play上的关键排名因素&#…

Kafka延迟队列实现分级重试

技术方案 方案背景 Kafka队列消息消费处理过程中&#xff0c;发生处理异常&#xff0c;需要实现重试机制&#xff0c;并基于重试次数实现不同延迟时间重试方案。 方案介绍 通过实现Kafka延迟队列来实现消息重试机制。 目标&#xff1a; 支持所有业务场景的延迟重试支持多…

Maven核心配置文件深度解析:pom.xml完全指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师&#xff0c;数学与应用数学专业&#xff0c;10年以上多种混合语言开发经验&#xff0c;从事DICOM医学影像开发领域多年&#xff0c;熟悉DICOM协议及…

MSTP多域生成树

协议信息 MSTP 兼容 STP 和 RSTP&#xff0c;既可以快速收敛&#xff0c;又提供了数据转发的多个冗余路径&#xff0c;在数据转发过程中实现 VLAN 数据的负载均衡。 MSTP 可以将一个或多个 VLAN 映射到一个 Instance&#xff08;实例&#xff09;&#xff08;一个或多个 VLAN…

MQTT 服务器(emqx)搭建及使用(一)

一. EMQX 服务器搭建 1.下载EMQX 下载链接&#xff1a;Windows | EMQX 文档 官方手册 2.下载内容解压至盘符根目录 3.进入bin文件夹&#xff0c;在地址栏输入cmd 4.依次输入下面命令安装服务 .\emqx.cmd install .\emqx.cmd console 5.设置自启动 创建批处理文件&#x…

在Thinkphp中使用JWT 包括JWT是什么,JWT的优势

首先了解一下什么是JWT JWT 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间以 JSON 对象形式安全传输信息4。其核心特点包括&#xff1a; 结构&#xff1a;由三部分组成&#xff08;Header、Payload、Signature&#xff09;&#xff0c;通过点号…

hackmyvn-casino

arp-scan -l nmap -sS -v 192.168.255.205 目录扫描 dirsearch -u http://192.168.255.205/ -e * gobuster dir -u http://192.168.255.205 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php -b 301,401,403,404 80端口 随便注册一个账号 玩游戏时的…

图表配置表增加分析指标字段

在设计报表图表配置表时&#xff0c;为存储 同比、环比 这类分析指标&#xff0c;建议通过以下方式定义字段结构和命名&#xff1a; 一、字段设计方案 // 配置表示例结构 interface ChartConfig {id: string; // 唯一标识name: string; // 图表…