scala函数进阶篇
1、求值策略
scala里有两种求值策略
Call By Value -先对函数实参求值,在函数体中用这个求出的参数值。
Call By Name -先不对函数实参求值,而是函数实参每次在函数体内被用到时都会求值。
scala通常使用Call By Value
如果函数形参类型以 =>开头,那么就是在使用Call By Name
def foo(x : Int)= x //Call By Value
def foo(x : => Int)= x //Call By Name
def loop():Int = loop //递归函数 //> loop: ()Int
def bar(x : Int,y : =>Int) =1 //> bar: (x: Int, y: => Int)Int
bar(1,loop) //> res3: Int = 1
//bar(loop,1) //会死循环
2、高阶函数
用函数作为形参或带返回值的函数,称为高阶函数
def operate(f: (Int,Int) => Int)={
f(4,4)
}//形参传入的是一个函数
def greeting()= (name: String) =>{"hello "+name}//返回一个匿名函数
3、匿名函数
匿名函数就是函数常量,也称为函数文字量
在scala里,匿名函数的定义格式为(形参列表)=>{函数体}
4、柯理化
柯理化函数把具有多个参数的函数转换为一条函数链,每个节点上是单一参数
def add(x: Int,y: Int)= x + y //常规函数写法
def add(x: Int)(y: Int) = x + y //scala中柯理化的语法
5、递归函数
在函数式编程中是实现循环的一种技术。
缺陷:递归的层数越深,栈就越多。
6、尾递归函数
尾递归函数中所有递归形式的调用都出现在函数的末尾。
当编译器检测到一个函数调用的是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
def factorial(n: Int):Int = {
if(n<=0) 1
else n*factorial(n)
}
@annotation.tailrec
def factorial(n: Int,m: Int):Int = {
if(n<=0) m
else factorial(n-1,m*n)
}
-----------下面是scala中常用函数的使用------------
val multiplier = (i: Int, m: Int) => i * m //> multiplier : (Int, Int) => Int = <function2>
def function1(n: Int): Int = {
multiplier.apply(n, 2) //等价于multiplier(n,2)
} //> function1: (n: Int)Int
function1(1) //> res4: Int = 2
def function2(m: (Int) => Int) = m //> function2: (m: Int => Int)Int => Int
def funint2(m: Int): Int = m //> funint2: (m: Int)Int
function2(funint2)(2) //> res5: Int = 2
def function3(f: (Int, Int) => Int) = f //> function3: (f: (Int, Int) => Int)(Int, Int) => Int
def funint3(m: Int,n: Int): Int= m*n //> funint3: (m: Int, n: Int)Int
function3(funint3)(2,3) //> res6: Int = 6
def greeting()= (name: String) => {"hello "+ name}
//> greeting: ()String => String
greeting()("xiaoming") //> res7: String = hello xiaoming
val function4 = (x: Int) => x + 1 //> function4 : Int => Int = <function1>
function4(4) //>res8: Int = 5
val function5 = (x:Int) => {
if(x > 1){
"x>1 and x=" +x
}else{
"x<1 and x = " +x
}
} //> function5 : Int => String = <function1>
function5(5) //> res9: String = x>1 and x=5
val function6 = (_ : Int) + ( _ :Int) //> function6 : (Int, Int) => Int = <function2>
function6(5,6) //> res10: Int = 11
def function7(a:Int, b:Int, c:Int) = a+b+c //> function7: (a: Int, b: Int, c: Int)Int
val function8 = function7 _ //> function8 : (Int, Int, Int) => Int = <function3>
function8(1,2,3) //> res11: Int = 6
def function9(args: Int*) = for (arg <- args) println(arg)
//> function9: (args: Int*)Unit
function9(1,2,3) //> 1
//| 2
//| 3
scala函数进阶篇的更多相关文章
- 第六篇:Python函数进阶篇
在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点: 一.Python的迭代器 ...
- Golang简单入门教程——函数进阶篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...
- Scala函数高级篇
一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...
- Python之函数——进阶篇
嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...
- Python—函数进阶篇
lambda表达式(匿名函数表达式) 作用:创建一个匿名函数对象.同def类似,但不提供函数名. 语法:lambda [形参1,形参2,...] : 表达式 语法说明 lambda 只是一个表达式,它 ...
- scala函数进阶与lazy的作用
内容如下. lazy修饰的变量可以延迟初始化,如下面所示,文件未必存在,file变量未必有内容.
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发
代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介 koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...
- labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用
跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...
随机推荐
- 【查询优化】怎样用SQL语句查看查询的性能指标
一.SET STATISTICS IO (有关TSQL语句查询所产生的磁盘活动量) --显示有关由Transact-SQL 语句生成的磁盘活动量的信息 SET STATISTICS IO ON -- ...
- PowerShell中进行文件读取,信息排序,分类计数。
这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...
- 【WPF】ListBox使用UserContrl作为子控件,引入UserContrl界面
<ListBox x:Name="housePlansLB" Margin="0" ItemsSource="{Binding HousePla ...
- CentOS 修改系统语言的方法
使用如下命令: export LANG="en_US.UTF-8" 可以修改环境变量LANG,修改之后立即生效,当时当系统重新启动时便会又变成原来的语言 另外两种修改语言的方法: ...
- signal(SIGPIPE, SIG_IGN) (转)
signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...
- Nhibernate 一对一,一对多,多对多 成功映射
前语: 在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上. 1.一对一关联关系的映射: <one-to-one name=" ...
- kafka操作清单
1. 查看topic个数 ./kafka-topics.,dwtest-data3:,dwtest-data4: 2. 查看topic的生产者与消费者消息 ./kafka-topics.,dwtest ...
- print spooler 服务无法启动 打印机全部消失
这往往是失败的打印任务导致的. 打开 C:\Windows\System32\spool\PRINTERS ,这个目录下的文件全是打印缓存,失败的任务也保存在这里.把这里的文件全部删除,然后再重新启动 ...
- ApplicationEventMulticaster not initialized - call 'refresh' before
https://stackoverflow.com/questions/45318618/applicationeventmulticaster-not-initialized-call-refres ...
- Maqetta源码运行
一.Maqetta简介 Maqetta是IBM开发的一个创建桌面和移动用户界面的HTML5设计编辑工具.该项目已经捐助给开源机构Dojo基金会.Maqetta提供WYSIWYG可视化HTML5用户界面 ...