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的大门了.跟其他编程语言一样 ...
随机推荐
- 【火狐FireFox】同步失败后,书签被覆盖,如何恢复书签
问题场景: 使用公司的电脑,下载安装火狐,登录个人帐号后,火狐会自动开始同步书签.但有时候会同步失败,比如登录之前选的是[本地服务],而最新的书签都是在[全球服务]理,那么很有可能同步到的是N久之前的 ...
- 利用GDB对程序进行调试
第一章初涉调试会话 调试工具 GDB,Unix下最常用的调试工具 DDD,基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse,IDE也是一种调试工具 atoi( )把字符串变为整数 ...
- 7-zip 压缩算法及C SDK使用
pdf版本下载:http://files.cnblogs.com/davad/7-zip_and_SDK.pdf 1. 介绍 官方网址:中文:http://sparanoid.com/lab/7z/ ...
- 使用JPedal取代PDFBox
http://wanggp.iteye.com/blog/1144177 ———————————————————————————————————————————————— 之前都是使用PDFBOX0. ...
- Charles安装包及破解包下载地址
Charles安装包及破解包下载地址 http://xclient.info/s/charles.html?_=baf317d2a9932afca9b32c327f8a34c9
- 关于Nginx里面的配置文件里面的location参数的意思
location是指当遇到这个单词的时候,把root改成大括号里面的值,再把单词和后面的路径加上root变成总的文件路径进行搜索,如果没有location,直接把root加上域名后面的路径变成总的文件 ...
- 各个层次的gcc警告
http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attri ...
- 回调方法介绍之中国好室友篇(Java示例)
前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...
- android Fragment 笔记
Fragment多用于平板中,Fragment当成Activity的一个界面的一个组成部分,Fragment有自己的生命周期,但是必须依托在Activity中. 参考链接 https://develo ...
- linux gzip 命令详解
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用. 语法:gzip ...