scala方法与函数

定义方法
定义函数
方法和函数的区别
scala的方法函数操作

 

1.9 方法与函数
1.9.1 定义方法

定义方法的基本格式是:

def 方法名称(参数列表):返回值类型 = 方法体
def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
//也可以定义成
//def add(x: Int, y: Int) = x + y
//或者
//def add(x: Int, y: Int){x + y} //省略“=”时始终返回Unit,一定要用大括号把方法体括起来

带有多参数列表的方法:

def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9

无参方法:不包括参数列表

def add=System.getProperty("user.name")

空参方法:

def add()=System.getProperty("user.name")

空参方法可以作为最终表达式出现,实际上是方法调用,只不过Scala规定空参方法的调用可以省略()。但是无参方法不允许使用调用,建议当成普通变量使用()。示例如下:

scala> def name:String = System.getProperty("user.name")
name: String
​
scala> name             //当普通变量使用,但每次引用变量都会执行相应表达式
res0: String = liyadong
​
scala> name()           //非法访问
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
              name()
                  ^
​
scala> def name():String = System.getProperty("user.name")
name: ()String
​
scala> name             //空参方法调用可以省略()
res2: String = liyadong
​
scala> name()
res3: String = liyadong

方法体是多行语句的表达式:

def getSquareString(input: Double): String = {  
  val square = input * input  
  square.toString
}

方法定义小结:

# 1. 方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型
# 2. 方法的返回值默认是方法体中最后一行表达式 的值,当然也可以用return来执行返回值,但不推荐这么做。
# 3. 若使用return来指定函数的返回值,scala的类型推断将会失效,要显式指定返回值类型。
# 4. 方法也可以没有返回值(返回值是Unit)省略=即可
package com.qianfeng.scala
​
/**
 * 方法
 */
object Demo05_Func {
  def main(args: Array[String]): Unit = {
    //定义方法
    def add(a:Int,b:Int):Int = a+b
    //调用方法
    println(add(10,20))
​
    //定义多个参数列表
    def addMultiple(a:Int,b:Int)(c:Int) = (a+b) * c
​
    //定义无参数
    def add1 = System.getProperty("user.name")
​
    //定义空参数
    def add2() = System.getProperty("user.name")
​
    //调用
    println(addMultiple(10,20)(30))
    println(add1)
    //println(add1()) //无参数方法不能使用()调用
    println(add2())
    println(add2)
​
    def add3(r:Double) = {
      val res = r*r
      println(res)
      res
    }
    println(add3(3))
​
    //可变参数
​
    //定义函数
    val f1 = (a:Int,b:Int) => a+b
    val f2 = (_:Int) + (_:Int)
​
    //匿名函数
    //(a:Int) => a*100
​
    //空参函数
    val username = () => System.getProperty("user.name")
​
    //调用
    println(f1)
    println(f1(10,20))
    println(username)
    println(username())
​
    //方法转换成函数
    val f11 = add _   //在方法名称后面加空格 _
    val f12 = add(_,_)
    println(f11)
    println(f12)
    println(f11(10,20))
    println(f12(10,20))
  }
}

1.9.2 定义函数

函数可以看做是带有参数的表达式。其本质是一个完整的对象,Scala 中的函数其实就是继承了Function(Trait) 的类的对象。

函数定义的基本语法:

val 变量 = (函数参数列表)=>函数体

函数的定义方式:

val f1 = ((a: Int, b: Int) => a + b)
val f2 = (a: Int, b: Int) => a + b
val f3 = (_: Int) + (_: Int)
val f4: (Int, Int) => Int = (_ + _)

匿名函数:

(x: Int) => x + 1
var inc = (x:Int) => x+100
//变量inc现在是一种可以像函数那样使用的函数
var x = inc(7)-1
​
//还可以如下定义具有多个参数的函数:
var mul = (x: Int, y: Int) => x*y
​
//变量mul现在是可以像函数那样使用的函数 
println(mul(3, 4))
​
//也可以定义不带参数的函数
var userDir = () => { System.getProperty("user.dir") }
​
//变量userDir现在是可以像函数那样使用的函数 
println( userDir )

空参函数:

val getTheAnswer = () => 42
println(getTheAnswer()) // 42
1.9.3 方法和函数的区别
# 方法不能做为最终表达式出现,而函数可以
# 方法名是方法调用,而函数名只是代表函数对象本身
# 方法可以转换为函数,所以一般也不必严格区分
- 自动转换:在需要函数的地方,如果传递一个方法,Scala能够自动把方法转换为函数
- 手动转换

两种方式将方法转换成函数:

1、把方法作为参数传给另一个方法或者函数的时候,方法自动被转化成函数。

2、手动使用神奇的下划线_ 将方法被转化成函数:

scala> def m1(x:Int,y:Int) = x + y
m1: (x: Int, y: Int)Int
​
scala> val f1=m1 _      //方式一:方法被转化成函数
f1: (Int, Int) => Int = <function2>
​
scala> val f1=m1(_,_)   //方式二:方法被转化成函数
f1: (Int, Int) => Int = <function2>
​
scala> val f1=m1            //不允许将方法直接赋值给变量,方法不是值,而函数与其他数据类型一样
<console>:12: error: missing argument list for method m1
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `m1 _` or `m1(_,_)` instead of `m1`.
       val f1=m1
              ^
1.9.4  Scala的方法函数操作

定义一个方法或函数实现随机组合车牌号,仅考虑后5位全是数字的情况。

//根据输入前缀返回随机车牌号,如输入“京A”,返回“京A88888”
def generateCarNo(prefix:String):String={
  var carNo=prefix
  for(i<-1 to 5){
    val randNum=(Math.random()*10).toShort.toString
    carNo+=randNum
  }  
  carNo
}
​
//使用函数
val generator=(prefix:String)=>{
  var carNo=prefix
  for(i<-1 to 5){
    val randNum=(Math.random()*10).toShort.toString
    carNo+=randNum
  }
  carNo
}
​
//方法转换函数
val generator1=generateCarNo _ //注意空格
//或者
val generator2=generateCarNo(_)
​
//调用一个方法和三个函数
print(generateCarNo("京A"))
print(generator("京C"))
print(generator1("京D"))
print(generator2("京E"))

Guff_hys_python数据结构,大数据开发学习,python实训项目-CSDN博客

 

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

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

相关文章

html第一阶段到底再讲什么

通过这个方式来学习javaweb的全部框架 服务器数据库和连接前端和后端的方式

I Doc View在线文档预览系统cms.json存在RCE漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 i Doc View是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 漏洞概述 iDocView是一个在线文档I Doc View在线文档预览系统cmd.json 处存在命令执行漏洞&#xff0c;攻击者可通过此漏洞获…

Windows本地的RabbitMQ服务怎么在Docker for Windows的容器中使用

1. 进入管理界面 windows安装过程请访问&#xff1a;Windows安装RabbitMQ、添加PHP的AMQP扩展 浏览器访问&#xff1a;http://127.0.0.1:15672/ 2. 创建虚拟主机 上面访问的是 RabbitMQ 的管理界面&#xff0c;可以在这个界面上进行一些操作&#xff0c;比如创建虚拟主机、…

抖音跑腿小程序开发指南:从零开始到上线

如今&#xff0c;抖音跑腿小程序的开发已经成为一项具有巨大潜力的领域。本文将为您提供一份详尽的开发指南&#xff0c;从零开始引导您完成一个成功的抖音跑腿小程序的开发和上线过程。 第一步&#xff1a;确定目标和需求 了解用户的期望&#xff0c;确定小程序的功能模块&a…

凸函数笔记(2)

目录 4. 凸函数的结构5. 拟凸函数5.1 定义与等价刻画5.2 可微函数的拟凸性判定5.3 保拟凸运算练习 4. 凸函数的结构 本节将证明&#xff1a; 给定凸函数 f f f 的一个相对内点 x x x, 必存在过 ( x , f ( x ) ) (x,f(x)) (x,f(x)) 的一个仿射函数 y f ( x ) v T ( y − x…

Lumerical 技巧------Plot in New Window

Lumerical 技巧------Plot in New Window 简介正文 简介 当我们在计算模式分布后想要观察模式对应的图像&#xff0c;为了清晰地观察到一些细节&#xff0c;我们可以通过点击图像绘制窗口的 Plot in New Window 按键来实现。 正文 默认模式绘制图像如下&#xff1a; 窗口很…

C++中的继承(一)

文章目录 前言概念访问限定符基类和派生类的赋值转换继承中的作用域派生类的默认成员函数构造函数 拷贝构造析构函数 继承的其他一些细节 前言 我们之前说过&#xff0c;继承是面向对象的三大特性。 面向对象的三大特性&#xff1a; 封装、继承、多态。 封装在类和对象体现出…

【unity小技巧】最简单的FPS游戏准心跳动动画控制

最终效果 文章目录 最终效果前言绘制简单的准心UI实现不同状态准心大小变化射击准心跳动的效果完结 前言 游戏准心跳动在FPS也是比较常用的功能&#xff0c;可以增强游戏反馈和打击感&#xff0c;丰富游戏内容&#xff0c;实现准心跳动的方式五花八门&#xff0c;我不知道别人…

Redis Streams 实现消息队列

简单介绍 Redis中有三种消息队列模式&#xff1a; 可以看出&#xff0c;作为Redis 5.0 引入的专门为消息队列设计的数据类型&#xff0c;Stream 功能更加健全&#xff0c;更适合做消息队列分发。 Stream 可以包含 0个 到 n个元素的有序队列&#xff0c;并根据ID的大小进行排序…

【CMU 15-445】Lecture 10: Sorting Aggregations Algorithms 学习笔记

Sorting & Aggregations Algorithms SortingTop-N Heap SortExternal Merge Sort2-WAY External Merge SortK-WAY External Merge SortDouble Buffering Optimization AggregationsSortingHashing 本节课主要介绍的是数据库系统中的排序算法以及聚合算法 Sorting 排序算法…

数据结构期末考题之001

算法复杂度就是n&#xff08;0&#xff09;

JdbcTemplate

环境搭建 依赖 <!-- Oracle11g 连接驱动依赖。这里是个坑&#xff0c;官方提供的不能用 --><dependency><groupId>cn.easyproject</groupId><artifactId>ojdbc6</artifactId><version>12.1.0.2.0</version></dependency&g…

20231217在Canonical 官网下载ubuntu-20.04.6以及通过rufus-4.3p写入U盘作为安装盘

20231217在Canonical 官网下载ubuntu-20.04.6以及通过rufus-4.3p写入U盘作为安装盘 2023/12/17 11:45 百度搜索&#xff1a;https://ubuntu.com/ https://ubuntu.com/engage/migrating-from-rhel-centos-to-ubuntu-public-cloud?utm_sourcetakeover http://releases.ubuntu.co…

从关键新闻和最新技术看AI行业发展(2023.12.4-12.17第十二期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rock…

软件设计规约和评审

软件设计规约 概要设计规约&#xff1a;这是面向软件开发者的文档&#xff0c;主要作为软件项目管理人员、系统分析人员与设计人员之间交流的媒介。它指明了软件的组织结构&#xff0c;主要内容包括&#xff1a; 系统环境&#xff1a;硬件、软件接口与人机界面&#xff1b;外部…

半导体设备之外延炉简述

半导体设备对整个半导体行业起着重要的支撑作用。因半导体制造工艺复杂&#xff0c;各个环节需要的设备也不同&#xff0c;从流程工序分类来看&#xff0c;半导体设备主要可分为晶圆制造设备&#xff08;前道工序&#xff09;、封装测试设备&#xff08;后道工序&#xff09;等…

自动驾驶学习笔记(二十)——Planning算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 参考线平滑 双层状态机 EM Planner …

724. 寻找数组的中心下标

代码&#xff1a; class Solution {public int pivotIndex(int[] nums) {int last0; //放前一个下标的左右差值int now0; //放当前下标的左右差值// 0 位于边界&#xff0c;先算出 0 下标左右的差值for(int i1;i<nums.length;i){lastnums[i];}//判断是否 0 下标就已…

大模型自定义算子优化方案学习笔记:CUDA算子定义、算子编译、正反向梯度实现

01算子优化的意义 随着大模型应用的普及以及算力紧缺&#xff0c;下一步对于计算性能的追求一定是技术的核心方向。因为目前大模型的计算逻辑是由一个个独立的算子或者说OP正反向求导实现的&#xff0c;底层往往调用的是GPU提供的CUDA的驱动程序。如果不能对于整个计算过程学习…

Ubuntu 常用命令之 cp 命令用法介绍

cp命令在Ubuntu系统中用于复制文件或目录。它的基本格式是cp [选项] 源文件或目录 目标文件或目录。 以下是一些常用的cp命令选项 -i&#xff1a;在覆盖目标文件之前将给出提示。-r或-R&#xff1a;递归复制&#xff0c;用于目录的复制操作。-v&#xff1a;详细模式&#xff…