Scala 函数(二)
文章目录
- Scala 函数
- 过程
- 匿名函数
- 柯里化函数(Curring)
- 懒值lazy
Scala 函数
Scala中要定义函数,需要给出函数的名称,参数和函数体
def function(x: Double)= if (x > 0 )x else 0
**必须给出所有参数的类型,不过只要函数不是递归的 ,可以不用指定返回值类型,Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
如果函数体需要多个表达式完成,可以用代码块,块中最后一个表达式的值就是函数的返回值
**
package function
/*** 函数默认值&带值参数 --> 函数默认值,在调用时传值则使用指定值,不传值则使用默认值* 默认值参数 --> 不写返回值自动推断* 可变长参数 --> 放在参数列表的最后一位* 递归函数--> 指定返回值类型*/object Function1 {def main(args:Array[String]): Unit = {// 标准格式// println(function1(1,2))// 自动推导返回值类型// println(function2(1,2))// 可以指定自参数// function3(b="Number= ",a = 1)// 默认值参数指定一个参数名// function4(age = 19)// 对默认值参数进行修改
// function4("李四",age = 19)// 可变长参数
// val sum = function5("求和:",1,2,3,4,5 )
// println(sum)// val jc1 = jc(5)
// println(jc1)}// 递归调用需要给定返回值类型def jc(x:Int): Int={if(x >= 1){x * jc(x-1)}else{1}}// 可变长参 只能放到参数表最后一位def function5(str:String,y:Int*) ={var sum = 0;for(num <- y){sum += num}sum}// 默认值参数 不写返回值自动推断def function4(sex:String = "男",age:Int)={println(sex,age)}// 无返回值 指定参数def function3(a:Int,b:String): Unit= {print(b,a)}// 自动推导返回值类型def function2(x:Int ,y:Int) ={x * y}// def 方法名(方法参数):返回值类型={// 返回// }def function1(x:Int ,y:Int ):Int={x + y}}
过程
Scala 对于不返回值的函数有reshuffle的表示法,如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit。这样的函数被承做过程(procedure)。过程不返回值
package function
object Function1 {def main(args:Array[String]): Unit = {function12(2,4)}def function12(x:Int ,y:Int) {println(x * y)}
}
匿名函数
没有函数名的函数,只有函数体
语法:`(arg1:类型,arg2:类型…) => 函数体
package function/*** 匿名函数*/
object Function2 {def main(args:Array[String]) :Unit={val demo = (x:Int,y:Int) => x + yvar demo1 = () => "Hello World"println(demo(1,2))println(demo1())// 匿名函数 标准写法val f1:Function2[Int,Int,String] = (x:Int,y:Int) => x + "+"+ y + "="+ + (x + y)println(f1(3 ,5))// 简便写法val f2 = (x:Int,y:Int) => x + "+"+ y + "="+ + (x + y)println(f2)}
}
柯里化函数(Curring)
柯里化函数指将接受多个参数的函数,改造为接收单个参数的函数,并且返回一个函数对象的过程就称为柯里化
package function/*** 柯里化 函数*/
object Function03 {def main(args: Array[String]): Unit = {val demo1 = m2(1)println(demo1) // 返回一个 <function1> 对象println(demo1(2)) // 3val demo2 = m3(1)(_)println(demo2) // <function1>println(demo2(3)) // 4val demo3 = m3(1)(2)println(demo3) // 3}// 柯里化 将原来接收两个参数的函数 转为接收单个参数的函数,并且返回一个函数对象def method1(a:Int,b:Int)={a + b}// 柯里化标准写法// def m2(x:Int) = (y:Int) => (z:Int) => x+y+zdef m2(x:Int) = (y:Int) => x+y// 柯里化简便写法def m3(x:Int)(y:Int) = x + y}
懒值lazy
当val被lazy声明时,他的初始化将被延迟,知道我们首次对他进行取值才会进行初始化
// 被lazy 声明
scala> lazy val a = 1 / 0
a: Int = <lazy>
// 首次访问的时候才会执行
scala> println(a)
java.lang.ArithmeticException: / by zeroat .a$lzycompute(<console>:11)at .a(<console>:11)... 32 elided
// 未被lazy修饰,声明的时候就会抛出异常
scala> val b = 1 / 0
java.lang.ArithmeticException: / by zero... 32 elided
scala>
可以理解为懒值是介于 val 和 def 之间的状态
val 是声明的时候取值
lazy 首次访问的时候取值
def 每一次访问的时候都取值
Scala 函数(二)相关推荐
- Scala 函数篇笔记(二)
文章目录 基础篇 函数和方法的关系 声明方式 参数个数 噩梦篇 至简原则 地狱篇(重要) 函数可以作为对象赋值给变量 函数可以作为参数传递给其他函数 练习: 小问题 函数作为返回值使用 闭包 Q&am ...
- Spark常用的算子以及Scala函数总结
上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习 快速带你晋级 阅读全文 > 正文共11264个字,7张图,预计阅读时间28分钟. Spark与Scala 首先, ...
- Spark基础学习笔记13:Scala函数
文章目录 零.本讲学习目标 一.声明函数 (一)显式声明函数 1.声明格式 2.注意事项 3.案例演示 (1)加法函数 (2)阶乘函数 (二)隐式声明函数 1.声明格式 2.注意事项 3.案例演示 ( ...
- Scala函数的调用
scala函数分为: 传名调用和传值调用 传名调用: 就是将未计算的参数表达式直接应用到函数内部 传值调用: 先计算参数表达式的值,再应用到函数内部案例: object FunctionTest {d ...
- python之内置函数(二)与匿名函数、递归函数初识
一.内置函数(二) 1.和数据结构相关(24) 列表和元祖(2) list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转化成元组(如果是字典, ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )
文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...
- 类的初始化列表_探索未知种族之osg类生物---渲染遍历之draw函数二
我们今天今天真是进入SceneView::draw()函数. 1.判断主相机是否为隐藏状态也就是(camera->getNodeMask()==0),隐藏状态就会退出这个draw函数. 2.开始 ...
- 0046-简单的分段函数(二)
题目 简单的分段函数(二) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知下列分段函数,要求编一程序,输入 x,输出相应的 ...
- Scala 函数声明及调用案例详解
Scala 函数 函数是一组一起执行一个任务的语句. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的. Scal ...
最新文章
- PlayMaker GUI的Normalized
- 如何降低微服务测试成本?
- 连载:阿里巴巴大数据实践—实时技术
- 017——数组(十七) asort ksort rsort arsort krsort
- 抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?
- Spark基础学习笔记02:Spark运行时架构
- 基于Hosted WebCore 方式部署Web Role
- 如何加强云端的SSH安全性 TechTarget中国原创内容,原文链接:http://www.searchcl
- 土豆系统 Ghost xp3 装机版
- K8s之DashBoard
- Java的getbytes()方法使用
- Matlab coder生成C++代码
- APS 与 MES 的区别是什么?
- 商品属性的选择功能的实现
- 造市为先,解析四大消费赛道品牌直播规律|果集数据
- matlab输出数据为excel文件
- Python分类算法——多标签图像分类
- NVIDIA显卡驱动未加载问题——未完全解决
- spring中读取配置文件的方式,以及配置文件如何写
- 微软放弃“封禁”商业开源!