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. UBoot启动代码第一阶段流程

    http://blog.csdn.net/xautfengzi/article/details/7470134 前段时间了看了UBoot的源码,放了一段时间之后忘得差不多了.现做一些注释,方便以后温习 ...

  2. xslt转换xml

    实现json--> xml --(xlst)--> xml pom依赖 <dependency> <groupId>net.sf.json-lib</grou ...

  3. [转]SQL Server 2012 的 T-SQL 新功能 – 新的数据分析函数(LEAD、LAG)

    当您需要在 SQL Server 中利用 T-SQL 比较结果集的每一列跟前一列或后一列的差异时,在过去可能需要利用 CURSOR 搭配临时表变量,或是透过递归 CTE 来达到这个效果,如今 SQL ...

  4. ios开发中,xib加载view,loadNibNamed方法奔溃原因之一

    xib中某一属性在代码中已删除,但在xib中没有解除关联

  5. mybatis中如果存在参数不再实体中的是如何处理

    <select id="queryMapByType" parameterType="int" resultType="my.geomap.VO ...

  6. [mmc]设备树节点含义

    &mmc3 { status = "okay"; dmas = <&edma &edma >; dma-names = "tx&quo ...

  7. HBase shell 命令。

    HBase shell 命令. 进入hbase shell console$HBASE_HOME/bin/hbase shell如果有kerberos认证,需要事先使用相应的keytab进行一下认证( ...

  8. vlan pvid vid access口 trunk口

    VLAN技术浅谈    http://www.h3c.com.cn/MiniSite/H3care_Club/Data_Center/Net_Reptile/The_One/Home/Catalog/ ...

  9. rufus/scheduler

    之前先在initializers 文件夹下建立了一个task.rb ,rails服务启动的时候执行,本地没问题,可是服务器上启动了3个进程,会执行3遍,解决方法是 把task.rb 放到 script ...

  10. foreach、count、explode(对无限级分类的语法注释-显示无限级效果)

    foreach ($array as $key => $value) foreach仅能用于数组. 每次循环中,当前单元的键名也会在每次循环中被赋给变量$key. 当前单元的值被赋给$value ...