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

scala基础学习_方法函数

文章目录

  • 方法与函数
    • 函数(又称函数值/匿名函数)
      • 定义方法
        • 注意
      • 单参数函数
      • 多参数函数
      • 函数作为参数传递
    • 方法
    • 将方法转换为函数
    • 方法的返回值
    • 总结

方法与函数

函数(又称函数值/匿名函数)

  • 定义在任何地方:函数可以定义在类的成员中,也可以定义在顶层(即不在任何类或对象中这是scala3特性)。
  • 不能访问类的私有成员:除非函数定义在类内部,否则它不能访问类的私有成员。
  • 是一等公民:函数可以作为值传递,可以赋值给变量,可以存储在数据结构中,可以作为其他函数的参数或返回值。
  • 可以使用函数字面量定义:函数可以使用 => 符号定义匿名函数。

=> 符号在 Scala 中用于定义匿名函数,它提供了一种简洁的方式来定义函数,特别是在需要将函数作为参数传递给其他函数时。匿名函数是函数式编程的重要组成部分,使代码更加灵活和可组合。

在 Scala 中,匿名函数(也称为 lambda 表达式)通常与 val 一起使用,而不是 var。这是因为匿名函数本身是一个值,并且你通常不希望重新赋值给这个函数。

定义方法

val 函数名:函数类型=>返回类型 = (实际传入参数)=>表达式

简洁形式:这种形式的匿名函数直接将参数和表达式放在 => 符号的两侧。这种形式的函数没有函数体,因此它的返回值是 => 右侧表达式的结果。

// 定义参数类型返回类型,定义参数,表达式
val ldsx2: (Int, Int) => Unit = (a, b) => println(a, b)
// 定义参数 参数类型,表达式
val ldsx2 = (a:Int, b:Int) => println(a, b)

带函数体形式:这种形式的匿名函数使用花括号 {} 来定义函数体。函数体中的最后一个表达式是函数的返回值。

val ldsx3: (Int, Int) => Unit = (a, b) => {println(a, b)
}

定义部分

(Int, Int) => Unit 是 Scala 中的一种函数类型表示法,它表示一个接受两个 Int 类型参数并返回 Unit 类型结果的函数。这种表示法通常用于定义匿名函数(lambda 表达式)或高阶函数。

具体来说:

  • (Int, Int): 这部分表示函数接受两个参数,这两个参数的类型都是 Int
  • =>: 这个符号表示函数类型。
  • Unit: 这部分表示函数的返回类型。Unit 是 Scala 中的一个特殊类型,表示没有值,类似于 Java 中的 void

因此,(Int, Int) => Unit 表示一个函数类型,这个函数接受两个 Int 类型的参数,并返回 Unit 类型的结果。这意味着这个函数执行一些操作,但不返回任何值。

以下是一个使用 (Int, Int) => Unit 函数类型的例子:

表达式部分

  • (a, b): 这部分定义了匿名函数的参数列表。这个匿名函数接受两个参数,分别是 ab
  • =>: 这个符号表示函数字面量的开始。
  • { println(a, b) }: 这部分是匿名函数的主体,它是一个代码块。这个代码块包含一个表达式 println(a, b),这个表达式打印参数 ab 的值。
注意

在 Scala 中,当匿名函数的主体只包含一个表达式时,花括号 {} 可以省略。同样,当匿名函数只有一个参数时,圆括号 () 也是可选的。这些简化使得代码更简洁,但也保持了代码的可读性。

  1. 花括号 {}
    花括号用于定义匿名函数的主体。当匿名函数的主体只包含一个表达式时,花括号可以省略。例如:

    // 使用花括号
    val result1 = ary.filter( n => { n == 2 })// 不使用花括号
    val result2 = ary.filter(n => n == 2)
    

    在这两个例子中,n => n == 2 是一个匿名函数,它接受一个参数 n 并返回一个布尔值,表示 n 是否等于 2。当匿名函数的主体只有一个表达式时,花括号是可选的。

  2. 圆括号 ()
    圆括号用于定义匿名函数的参数列表。当匿名函数只有一个参数时,圆括号也是可选的。例如:

    // 使用圆括号
    val result3 = ary.filter((n) => n == 2)// 不使用圆括号
    val result4 = ary.filter(n => n == 2)
    

    在这两个例子中,n => n == 2(n) => n == 2 都是有效的匿名函数。当匿名函数只有一个参数时,圆括号是可选的。

单参数函数

val square: Int => Int = x => x * x// 调用匿名函数
println(square(5)) // 输出 25val square = x:Int => x*x

在这个例子中,square 是一个匿名函数,它接受一个 Int 类型的参数 x,并返回 x 的平方。

多参数函数

val add: (Int, Int) => Int   =     (a, b) => a + b// 调用匿名函数
println(add(3, 4)) // 输出 7

在这个例子中,add 是一个匿名函数,它接受两个 Int 类型的参数 ab,并返回它们的和。

val add: (Int, Int) => Int = (a, b) => a + b

这行代码定义了一个名为 add 的值,它实际上是一个匿名函数(也称为函数字面量)。下面是详细的语法解释:

  1. val add:
    • val 是一个关键字,用于定义一个不可变的值(类似于常量)。
    • add 是这个值的名称。
  2. : (Int, Int) => Int:
    • 这部分定义了 add 的类型。
    • (Int, Int) 表示这个函数接受两个 Int 类型的参数。
    • => 符号表示函数的参数和返回值之间的映射。
    • Int 表示这个函数返回一个 Int 类型的结果。
    • 因此,(Int, Int) => Int 表示这是一个接受两个 Int 参数并返回 Int 结果的函数类型。
  3. = (a, b) => a + b:
    • = 符号用于将右侧的匿名函数赋值给左侧的 add
    • (a, b) 表示匿名函数的参数列表,其中 ab 是两个 Int 类型的参数。
    • => 符号表示参数和函数体之间的映射。
    • a + b 是函数体,表示将参数 ab 相加并返回结果。

综上所述,这行代码定义了一个名为 add 的值,它是一个接受两个 Int 参数并返回它们之和的匿名函数。你可以像调用普通函数一样调用 add

println(add(3, 4)) // 输出 7

在这个例子中,add(3, 4) 调用了匿名函数 (a, b) => a + b,其中 a 被赋值为 3b 被赋值为 4,函数体 a + b 计算结果为 7,并打印出来。

函数作为参数传递

匿名函数通常用作高阶函数的参数。高阶函数是可以接受函数作为参数或返回函数作为结果的函数。

object Scalafunc {def main(args:Array[String]):Unit={// 匿名函数定义val fc :(Int,Int)=>Int = (a,b) =>a+bprintln(fc(1,2))greet("ldsx")lambda_func((a,b)=>a+b,1,"3")}def greet(name: String): Unit = {println(s"Hello, $name!")}def lambda_func(func :(Int,String)=>String,a:Int,b:String):Unit={val data = func(a,b)println(data)}}

lambda_func中,参数分为二部分,共三个

  1. func :(Int,String)=>String
    • 第一个参数接受匿名函数名称 func
    • 这个参数目是设置好匿名函数名称,确认匿名函数func接受的参数 与返回的数据类型
  2. a:Int,b:String
    • a,bfunc所需的参数,但是需要通过lambda_func传入函数内部给func调用

方法

  • 定义在类或对象中:方法定义在类或对象内部,是类或对象的一部分。
  • 可以访问类的成员:方法可以访问类的私有成员(如变量和其他方法)。
  • 不是一等公民:方法不能直接作为值传递,不能赋值给变量,不能存储在数据结构中,也不能作为其他方法的参数或返回值。
  • 使用 def 关键字定义:方法使用 def 关键字定义。
object Scalafunc {val ldsx = "hello"def main(args:Array[String]):Unit={// 匿名函数定义val fc :(Int,Int)=>Int = (a,b) =>a+bprintln(fc(1,2))greet("ldsx")// 访问成员println(ldsx)}def greet(name: String): Unit = {println(s"Hello, $name!")}}

将方法转换为函数

虽然方法不是一等公民,但你可以通过将方法转换为函数来使用它。这可以通过在方法后面加上一个下划线 _ 来实现。

class MyClass {def greet(name: String): String = {s"Hello, $name!"}
}val myObject = new MyClass
val greetFunction: String => String = myObject.greet _println(greetFunction("Scala")) // 输出 "Hello, Scala!"

在这个例子中,myObject.greet _greet 方法转换为了一个函数。

方法的返回值

在 Scala 中,函数和方法不需要显式地使用 return 关键字来返回值。Scala 的函数和方法会返回其最后一个表达式的结果

def add(a: Int, b: Int): Int = {a + b // 这个表达式的结果会被返回
}
val result = add(3, 4)
println(result) // 输出 7

在 Scala 中,过程方法是一种不返回任何值的方法。过程方法的返回类型是 Unit,你可以省略 Unit,因为编译器可以推断出返回类型。以下是一个过程方法的示例

// 定义Unit过程方法不会有返回值
def fun3(a:String):Unit={var info_d = "aaaa"info_d
}// 设置返回值将会返回最后一个表达式 info_d
def fun4(a:String):String={var info_d = "aaaa"info_d
}// 当最后一个表达式是print 则报错,因为print
def fun4(a: String): String = {var info_d = ainfo_dprintln(info_d)}// 不定义返回值 自动编译判断,当你返回表达式有结果时为过程函数,当返回值时为返回值函数
def fun4(a: String) = {var info_d = aprintln(info_d,111)a
}

总结

  • 方法 是类或对象的一部分,可以访问类的私有成员,但不是一等公民。
  • 函数 可以在任何地方定义,不能直接访问类的私有成员(除非在类内部定义),但它们是一等公民,具有更大的灵活性和功能性。

相关文章:

scala基础学习_方法函数

文章目录 方法与函数函数(又称函数值/匿名函数)定义方法注意 单参数函数多参数函数函数作为参数传递 方法将方法转换为函数方法的返回值总结 方法与函数 函数(又称函数值/匿名函数) 定义在任何地方:函数可以定义在类…...

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成,.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …...

【Bug】报错信息:Required request body is missing(包含五种详细解决方案)

大家好,我是摇光~ 遇到“Required request body is missing”错误通常意味着服务器期望在HTTP请求中包含一个请求体(body),但是实际上并没有收到。 例如: 当你在使用网页或应用程序的后台(比如一个网站或手…...

Docker 专栏 —— Dockerfile 指令详解

文章目录 ADD 复制文件COPY 复制文件ARG 设置构建参数CMD 容器启动命令ENTRYPOINT ⼊⼝点ENV 设置环境变量EXPOSE 声明暴露的端⼝FROM 指定基础镜像LABEL 为镜像添加元数据MAINTAINER 指定维护者的信息RUN 执⾏命令USER 设置⽤户VOLUME 指定挂载点WORKDIR 指定⼯作⽬录 ADD 复制…...

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…...

在ubuntu下对NFS做性能测试

安装NFS 首先,安装服务 sudo apt update sudo apt install nfs-kernel-server然后创建共享文件夹 # 请自定义你自己的共享目录 sudo mkdir -p /exports/nfs4/homes sudo chmod -R 777 /exports/nfs4/homes# 这个可以根据no_root_squash标致选择设置。 # 如果不设…...

Spring-Cloud-Gateway-Samples,nacos为注册中心,负载均衡

背景:本想找个简单例子看下,无奈版本依赖太过复杂,花了点时间。记录下吧 使用Spring Cloud Gateway作为网关服务,Nacos作为注册中心,实现对子服务的负载均衡访问。简单例子。 一、gateway-main-nacos服务端&#xff…...

StarRocks Awards 2024 年度贡献人物

在过去一年,StarRocks 在 Lakehouse 与 AI 等关键领域取得了显著进步,其卓越的产品功能极大地简化和提升了数据分析的效率,使得"One Data,All Analytics" 的愿景变得更加触手可及。 虽然实现这一目标的道路充满挑战且漫…...

Autoencoder(李宏毅)机器学习 2023 Spring HW8 (Boss Baseline)

1. Autoencoder 简介 Autoencoder是一种用于学习数据高效压缩表示的人工神经网络。它由两个主要部分组成: Encoder 编码器将输入数据映射到一个更小的、低维空间中的压缩表示,这个空间通常称为latent space或bottleneck。 这一过程可以看作是数据压缩,去除冗余信息,仅保留…...

深入探索 ScottPlot.WPF:在 Windows 桌面应用中绘制精美图表的利器

一、ScottPlot.WPF 简介 ScottPlot.WPF 是基于 ScottPlot 绘图库专门为 Windows Presentation Foundation (WPF) 框架量身定制的强大绘图组件。它无缝集成到 WPF 应用程序中,为开发者提供了一种简洁、高效的方式来可视化数据,无论是科学研究中的实验数据展示、金融领域的行情…...

React中的useMemo 和 useEffect 哪个先执行?

在 React 组件的渲染过程中,useMemo 和 useEffect 的执行顺序是不同的。具体来说: useMemo 先执行:useMemo 是在 渲染阶段 执行的,它的作用是缓存计算结果,确保在渲染过程中可以直接使用缓存的值。 useEffect 后执行&…...

错误修改系列---基于RNN模型的心脏病预测(pytorch实现)

前言 前几天发布了pytorch实现,TensorFlow实现为:基于RNN模型的心脏病预测(tensorflow实现),但是一处繁琐地方 一处错误,这篇文章进行修改,修改效果还是好了不少;源文章为:基于RNN模型的心脏病…...

Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越

当下AI与数据库的融合已成为推动数据管理和分析领域发展的重要力量。传统的数据库查询方式,如结构化查询语言(SQL),要求用户具备专业的数据库知识,这无疑限制了非专业人士对数据的访问和利用。为了打破这一壁垒&#x…...

Stable Diffusion本地部署教程(附安装包)

想使用Stable Diffusion需要的环境有哪些呢? python3.10.11(至少也得3.10.6以上):依赖python环境NVIDIA:GPUgit:从github上下载包(可选,由于我已提供安装包,你可以不用git)Stable Diffusion安装包工具包: NVIDIA:https://developer.nvidia.com/cuda-toolkit-archiv…...

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性(五大功能域) 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …...

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总…...

C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词…...

计算机网络(六)应用层

6.1、应用层概述 我们在浏览器的地址中输入某个网站的域名后,就可以访问该网站的内容,这个就是万维网WWW应用,其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名,而TCP/IP的网际层使用IP地…...

上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天探底回升,沪指盘中跌超1.6%,创业板指一度跌逾3%,午后集体拉升翻红…...

conda相关操作

conda 是一个开源的包管理和环境管理工具,主要用于 Python 和数据科学领域。它可以帮助用户安装、更新、删除和管理软件包,同时支持创建和管理虚拟环境。以下是关于 conda 的所有常见操作: 1. 安装 Conda Conda 通常通过安装 Anaconda 或 Mi…...

使用TCP协议实现智能聊天机器人

实验目的与要求 本实验是程序设计类实验,要求使用原始套接字编程,掌握TCP/IP协议与网络编程Sockets通信模型,并根据教师给定的任务要求,使用TCP协议实现智能聊天机器人。 (1)熟悉标准库socket 的用法。 …...

PHP二维数组去除重复值

Date: 2025.01.07 20:45:01 author: lijianzhan PHP二维数组内根据ID或者名称去除重复值 代码示例如下: // 假设 data数组如下 $data [[id > 1, name > Type A],[id > 2, name > Type B],[id > 1, name > Type A] // 重复项 ];// 去重方法 $dat…...

2025年01月11日Github流行趋势

项目名称:xiaozhi-esp32 项目地址url:https://github.com/78/xiaozhi-esp32项目语言:C历史star数:2433今日star数:321项目维护者:78, MakerM0, whble, nooodles2023, Kevincoooool项目简介:构建…...

备战蓝桥杯 队列和queue详解

目录 队列的概念 队列的静态实现 总代码 stl的queue 队列算法题 1.队列模板题 2.机器翻译 3.海港 双端队列 队列的概念 和栈一样,队列也是一种访问受限的线性表,它只能在表头位置删除,在表尾位置插入,队列是先进先出&…...

IT面试求职系列主题-Jenkins

想成功求职,必要的IT技能一样不能少,先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统,并在发生更改时启动和监视构建系统。 2)Maven、Ant和Jenkins有什么区别…...

Vue篇-06

1、路由简介 vue-rooter:是vue的一个插件库,专门用来实现SPA应用 1.1、对SPA应用的理解 1、单页 Web 应用(single page web application,SPA)。 2、整个应用只有一个完整的页面 index.html。 3、点击页面中的导航链…...

mysql binlog 日志分析查找

文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…...

ubuntu 配置OpenOCD与RT-RT-thread环境的记录

1.git clone git://git.code.sf.net/p/openocd/code openocd 配置gcc编译环境 2. sudo gedit /etc/apt/source.list #cdrom sudo apt-get install git sudo apt-get install libtool-bin sudo apt-get install pkg-config sudo apt-install libusb-1.0-0-dev sudo apt-get…...

双系统解决开机提示security Policy Violation的方法

最近,Windows系统更新后,发现电脑开机无法进入桌面,显示“Verifiying shim SBAT data failed: security Policy Violation; So mething has gone seriously Wrong: SBAT self-check failed: Security Policy Violation”的英文错误信息。为了…...

附加共享数据库( ATTACH DATABASE)的使用场景

附加共享数据库(使用 ATTACH DATABASE)的功能非常实用,通常会在以下几种场景下需要用到: 1. 跨数据库查询和分析 场景: 你的公司有两个独立的数据库: 一个存储了学生信息 (school.db)一个存储了员工信息 …...

上海网站建设优势/青岛网站建设制作推广

题目 输入一个链表,从尾到头打印链表每个节点的值。返回新链表。 分析 可以借助栈也可以使用递归 代码 /*** 从尾到头打印列表*/ public class PrintListReverse {public static void main(String[] args) {ListNode node1 new ListNode();ListNode node2 ne…...

深圳p2p网站建设/做销售有什么技巧和方法

一、忘记除SYS、SYSTEM用户之外的用户的登录密码。用SYS (或SYSTEM)用户登录: CONN SYS/PASS_WORD AS SYSDBA;使用如下语句修改用户的密码: ALTER USER user_name IDENTIFIED BY "newpass";注意:密码不能全是数字。并且不能是数字开头。否则会出现&#x…...

帮一个公司做网站多少钱/超级优化

目前,信息流短视频排序是基于CTR预估Wide&Deep深层模型。在Wide&Deep模型基础上做一系列相关优化,包括相关性与体感信号引入、多场景样本融合、多模态学习、树模型等,均取得不错收益。 总体上,短视频模型优化可分为两部分…...

刷东西网站怎么做/企业营销策划方案范文

动态类型 在 kotlin 中调用 java 代码 import java.util.* fun demo(source: List<Int>) {val list ArrayList<Int>()for (item in source )list.add(item)for (i in 0..source.size() - 1)list[i] source[i] } java无返回值的void在kotlin中要用unit代替。...

flask做视频网站/建站教程

因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库.。在此之前&#xff0c;一直没有接触过空间数据库&#xff0c;在操作空间数据库时 绕了许多弯。。。 因此写一篇随笔做一个总结。 首先&#xff0c;我们了解一下空间数据库&#xff1a;空间数据库是指…...

有什么网站可以做编程题/企业推广策略

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6937 Accepted Submission(s): 2957Problem DescriptionXX星有许多城市&#xff0c;城市之间通过一种奇怪的高速公路SARS(Supe…...