文章目录

  • 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 函数(二)相关推荐

  1. Scala 函数篇笔记(二)

    文章目录 基础篇 函数和方法的关系 声明方式 参数个数 噩梦篇 至简原则 地狱篇(重要) 函数可以作为对象赋值给变量 函数可以作为参数传递给其他函数 练习: 小问题 函数作为返回值使用 闭包 Q&am ...

  2. Spark常用的算子以及Scala函数总结

    上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习  快速带你晋级 阅读全文 > 正文共11264个字,7张图,预计阅读时间28分钟. Spark与Scala 首先, ...

  3. Spark基础学习笔记13:Scala函数

    文章目录 零.本讲学习目标 一.声明函数 (一)显式声明函数 1.声明格式 2.注意事项 3.案例演示 (1)加法函数 (2)阶乘函数 (二)隐式声明函数 1.声明格式 2.注意事项 3.案例演示 ( ...

  4. Scala函数的调用

    scala函数分为: 传名调用和传值调用 传名调用: 就是将未计算的参数表达式直接应用到函数内部 传值调用: 先计算参数表达式的值,再应用到函数内部案例: object FunctionTest {d ...

  5. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二) 1.和数据结构相关(24) 列表和元祖(2) list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转化成元组(如果是字典, ...

  6. 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

    文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...

  7. 类的初始化列表_探索未知种族之osg类生物---渲染遍历之draw函数二

    我们今天今天真是进入SceneView::draw()函数. 1.判断主相机是否为隐藏状态也就是(camera->getNodeMask()==0),隐藏状态就会退出这个draw函数. 2.开始 ...

  8. 0046-简单的分段函数(二)

    题目 简单的分段函数(二) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知下列分段函数,要求编一程序,输入 x,输出相应的 ...

  9. Scala 函数声明及调用案例详解

    Scala 函数 函数是一组一起执行一个任务的语句. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的. Scal ...

最新文章

  1. PlayMaker GUI的Normalized
  2. 如何降低微服务测试成本?
  3. 连载:阿里巴巴大数据实践—实时技术
  4. 017——数组(十七) asort ksort rsort arsort krsort
  5. 抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?
  6. Spark基础学习笔记02:Spark运行时架构
  7. 基于Hosted WebCore 方式部署Web Role
  8. 如何加强云端的SSH安全性 TechTarget中国原创内容,原文链接:http://www.searchcl
  9. 土豆系统 Ghost xp3 装机版
  10. K8s之DashBoard
  11. Java的getbytes()方法使用
  12. Matlab coder生成C++代码
  13. APS 与 MES 的区别是什么?
  14. 商品属性的选择功能的实现
  15. 造市为先,解析四大消费赛道品牌直播规律|果集数据
  16. matlab输出数据为excel文件
  17. Python分类算法——多标签图像分类
  18. NVIDIA显卡驱动未加载问题——未完全解决
  19. spring中读取配置文件的方式,以及配置文件如何写
  20. 微软放弃“封禁”商业开源!

热门文章

  1. 引用@webServlet时出现WebServlet cannot be resolved to a type
  2. 关于方向导数和梯度你真的懂了吗?
  3. 搜狐宣布收购Go2Map
  4. 计算机网络基础--IP地址与子网划分
  5. reactor模型实现
  6. Web服务之Apache的配置和应用
  7. 小米2s Android pie,抢先体验Android Pie 小米MIX 2s已收到推送
  8. Mac下idea配置文件乱码
  9. 使用adb安装遇到的一些坑
  10. Nginx之突然不能域名访问