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)) // 输出 25

val 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+b
    println(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+b
    println(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 = a
      info_d
      println(info_d)
    }

// 不定义返回值 自动编译判断,当你返回表达式有结果时为过程函数,当返回值时为返回值函数
def fun4(a: String) = {
  var info_d = a
  println(info_d,111)
  a
}

   

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 分区索引简介

目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引(Local Partitioned Index)2.2 全局分区索引(Global Partitioned Index) 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…

Spring bean的生命周期和扩展

接AnnotationConfigApplicationContext流程看实例化的beanPostProcessor-CSDN博客,以具体实例看bean生命周期的一些执行阶段 bean生命周期流程 生命周期扩展处理说明实例化:createBeanInstance 构造方法, 如Autowired的构造方法注入依赖bean 如UserSer…

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中,我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤,但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式(Template Method Design Pattern)就为解决这类问题提供了…

01 Oracle自学环境搭建(Windows系统)

1 Oracle12C安装 1.1 下载 官网地址:https://www.oracle.com/ 进入官网→Resource→Customer Downloads 如果没有登录,会提示登录后后才能下载 选择适合自己的版本(我电脑是Windows系统 64位) 选择需要的安装包进行下载 双击下载…

java语法知识(二)

1. class文件可以直接拖动到idea中,显示源码。 2.idea快捷键: sout : System.out.println 输出内容.sout :---》 System.out.println(输出内容); psvm: public static void main() 格式化:ctrl altL 复制粘贴:ctrld 3.注释…

macos python环境安装

安装的问题 mac 安装 python brew install python 通过brew安装的python安装路径 打开终端,输入brew search python: 为啥会被安装在这里 Frameworks 的用途:/Library/Frameworks 是 macOS 系统中专门用于存放框架的目录。框架是一种结构…

计算机网络 笔记 数据链路层 2

1,信道划分: (1)时分复用TDM 将时间等分为“TDM帧”,每个TDM帧内部等分为m个时隙,m个用户对应m个时隙 缺点:每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据,那么就会在这个时间信道被闲置,利用…

ElasticSearch在Windows环境搭建测试

引子 也持续关注大数据相关内容一段时间,大数据内容很多。想了下还是从目前项目需求侧出发,进行相关学习。Elasticsearch(ES)是位于 Elastic Stack(ELK stack) 核心的分布式搜索和分析引擎。Logstash 和 B…

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端,为分组交换网上的不同主句提供通信服务,网络层的传输单位是数据报。 主要的功能; 1,路由选择:路由选择指网络层根据特定算法,为数据包从源节点到目…

Rubyer-WPF:打造优雅、精致的 WPF 用户界面

在桌面应用开发领域,WPF(Windows Presentation Foundation)凭借其强大的 UI 设计能力和丰富的功能,始终是开发者们青睐的工具之一。今天,我将为大家介绍一款专注于 WPF UI 设计的优秀项目——Rubyer-WPF,它…

设计模式 行为型 访问者模式(Visitor Pattern)与 常见技术框架应用 解析

访问者模式(Visitor Pattern)是一种行为设计模式,它允许你在不改变元素类的前提下定义作用于这些元素的新操作。这种模式将算法与对象结构分离,使得可以独立地变化那些保存在复杂对象结构中的元素的操作。 假设我们有一个复杂的对…

继承多态语法糖

抽象类(通用) 子类继承父类方法后,这个子类对象如果执行方法的话,只要子类重写了就执行子类的,不执行父类的。 /*** 功能:* 作者:IT伟* 日期:2025/1/13 19:20*/ // 抽象类 A abstract class A {// 构造函…

MarS:一个由生成基础模型驱动的金融市场模拟引擎

“MARS: A FINANCIAL MARKET SIMULATION ENGINE POWERED BY GENERATIVE FOUNDATION MODEL” 项目主页:https://mars-lmm.github.io/ 论文地址:https://arxiv.org/pdf/2409.07486 Github地址:https://github.com/microsoft/MarS/ 摘要 生成…

macOS 使用 FreeRDP 远程访问 Windows:完整指南20250109

🖥️ macOS 使用 FreeRDP 远程访问 Windows:完整指南 引言 随着远程办公需求的快速增长,跨平台远程管理已经成为不可或缺的技能之一。作为一款开源轻量的远程桌面协议实现工具,FreeRDP 为 macOS 用户提供了一个简单、高效的解决…

两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库

目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的,所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意:直接git pu…

计算机图形学【绘制立方体和正六边形】

工具介绍 OpenGL:一个跨语言的图形API,用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT:OpenGL的一个工具库,简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…

springboot高校教室资源管理平台

Spring Boot高校教室资源管理平台是一个基于Spring Boot框架开发的高校教室资源管理系统。 一、平台背景与意义 随着高校规模的不断扩大,教室资源的管理变得日益复杂。传统的管理方式往往依赖于人工记录和纸质文件,不仅效率低下,而且容易出…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…

正点原子STM32F103战舰版电容触摸键学习

一、tpad.h代码 #ifndef __TPAD_H #define __TPAD_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* TPAD 引脚 及 定时器 定义 *//* 我们使用定时器的输入捕获功能, 对TPAD进行检…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1,ZGC(JDK21之前) ZGC 的核心是一个并发垃圾收集器,所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节(TB)级内存,设计了基…