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函数进阶篇的更多相关文章

  1. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  2. Golang简单入门教程——函数进阶篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...

  3. Scala函数高级篇

    一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...

  4. Python之函数——进阶篇

    嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...

  5. Python—函数进阶篇

    lambda表达式(匿名函数表达式) 作用:创建一个匿名函数对象.同def类似,但不提供函数名. 语法:lambda [形参1,形参2,...] : 表达式 语法说明 lambda 只是一个表达式,它 ...

  6. scala函数进阶与lazy的作用

    内容如下. lazy修饰的变量可以延迟初始化,如下面所示,文件未必存在,file变量未必有内容.

  7. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  8. Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发

    代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介     koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...

  9. labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用

    跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...

随机推荐

  1. 【查询优化】怎样用SQL语句查看查询的性能指标

    一.SET STATISTICS IO  (有关TSQL语句查询所产生的磁盘活动量) --显示有关由Transact-SQL 语句生成的磁盘活动量的信息 SET STATISTICS IO ON -- ...

  2. PowerShell中进行文件读取,信息排序,分类计数。

    这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...

  3. 【WPF】ListBox使用UserContrl作为子控件,引入UserContrl界面

    <ListBox x:Name="housePlansLB" Margin="0" ItemsSource="{Binding HousePla ...

  4. CentOS 修改系统语言的方法

    使用如下命令: export LANG="en_US.UTF-8" 可以修改环境变量LANG,修改之后立即生效,当时当系统重新启动时便会又变成原来的语言 另外两种修改语言的方法: ...

  5. signal(SIGPIPE, SIG_IGN) (转)

    signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...

  6. Nhibernate 一对一,一对多,多对多 成功映射

    前语: 在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上. 1.一对一关联关系的映射: <one-to-one name=" ...

  7. kafka操作清单

    1. 查看topic个数 ./kafka-topics.,dwtest-data3:,dwtest-data4: 2. 查看topic的生产者与消费者消息 ./kafka-topics.,dwtest ...

  8. print spooler 服务无法启动 打印机全部消失

    这往往是失败的打印任务导致的. 打开 C:\Windows\System32\spool\PRINTERS ,这个目录下的文件全是打印缓存,失败的任务也保存在这里.把这里的文件全部删除,然后再重新启动 ...

  9. ApplicationEventMulticaster not initialized - call 'refresh' before

    https://stackoverflow.com/questions/45318618/applicationeventmulticaster-not-initialized-call-refres ...

  10. Maqetta源码运行

    一.Maqetta简介 Maqetta是IBM开发的一个创建桌面和移动用户界面的HTML5设计编辑工具.该项目已经捐助给开源机构Dojo基金会.Maqetta提供WYSIWYG可视化HTML5用户界面 ...