方法的定义

def functionName([参数列表]) : [return type] = {
function body
return []
}
  • 如果没有=和{}包裹的方法体,那么该方法被隐式申明为抽象(abstract)方法,包含它的类就是抽象类。
abstract class Test{
def hi(x : Int):Int
def he(x : Int){x + 1}
}
  • 当输入相同类型的参数个数无法确定时,可以使用变长参数,如:def sum(args : Int*) = {for(arg <- args) println(arg)}。
  • 如果方法体直接包裹在了花括号里面,而没有使用=连接,则方法的返回值就是(),其类型就是Unit,这样的方法就被称之为过程。可以为过程指定返回值类型为Unit,此时方法体中有return语句,方法返回值任然是Unit。

  • 不写明返回值的类型,程序会自行判断,最后一行代码的执行结果为返回值。

函数

Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。

Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。

Scala 中使用 val 语句可以定义函数,def 语句定义方法。

定义方式

 class Test1{
def met(x : Int) = x + 10
val fun = (x : Int) => x + 10 // 匿名函数 (x : Int) => x + 10 赋值给变量 fun
 }
  • 方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。
  • 函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。

  • 方法名意味着方法调用,函数名只是代表函数自身。
  • 方法可以没有参数列表页可以是空的参数列表。
  • 函数必须设置参数列表,可以是空的参数列表,但一定要设置。

方法和函数的相互转换

  • 把 x => func(x) 简化为 func _ 或 func(_) 的过程称为函数转换成方法

  • 把 func(_)或 func _ 展开为 x => func(x) 的过程为方法转换成函数

递归函数优化

正常递归函数会创建多个栈导致栈溢出,优化后不会创建新的栈,会使用前个函数的栈空间

通过注解优化递归函数(@annotation.tailrec),优化条件是最后一个语句是递归调用的函数,否则报错

def dgui(n: Int,x:Int): Int = {
if( x >= 1 ) n * dgui(n,x-1)
else 1
} @annotation.tailrec
def dguiTailrec(n: BigInt, acc: BigInt): BigInt = {
if(n <= 1) acc
else dguiTailrec(n-1, acc * n)
}

高阶函数

高阶函数就是使用其他函数作为函数的参数,或者使用其他函数作为函数的输出结果

test方法有两个参数,第一个参数是名为func的一个函数,该函数有一个String类型的参数,并且其返回值是Unit;第二个参数是String类型的cont

test的方法体是将第二个参数cont作为第一个参数即函数func的参数;test方法的返回值是Unit

Scala 函数柯里化(Currying)

柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

def add(x:Int,y:Int)=x+y

柯里化

def add(x:Int)(y:Int) = x + y

函数的currying化行为本质上也是一个高阶函数:接受现有的函数,返回新函数。
这个例子就是对上一个例子的currying化操作。传入第一个参数后返回一个函数,然后再传入第二个参数,完成第二个函数。这样就讲一个高阶函数拆解成两个一阶函数。

闭包

闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。

var factor = 3
val multiplier = (i:Int) => i * factor

Scala_方法和函数的更多相关文章

  1. Scala_方法、函数、柯里化

    方法.函数.柯里化 方法 声明方法: scala> def m1(x:Int,y:Int):Int = {     | x + y     | }m1: (x: Int, y: Int)Ints ...

  2. [Effective JavaScript 笔记]第26条:使用bind方法实现函数的柯里化

    bind方法的作用,除了有绑定函数到对象外,我们来看看bind方法的一些其它应用. 简单示例 例子:假设有一个装配URL字符串的简单函数.代码如下 function simpleURL(protoco ...

  3. OC的类方法、对象方法和函数

    OC语言中的方法和函数是有区别的:类内部叫方法,单独定义的叫函数,定义的格式也不同 类方法:+ (void) 方法名.对象方法:- (void) 方法名.函数:void 函数名(参数列表) #impo ...

  4. JAVA中String类的方法(函数)总结--JAVA基础

    1.concat()方法,当参数为两字符串时,可实现字符串的连接: package cn.nxl123.www; public class Test { public static void main ...

  5. Objective-C方法与函数的区别

    Objective-C方法与函数的区别 方法是唯对象所有 函数是不依赖于对象存在的 方法 函数 - (void)test; void test(); 方法是以减号 - 开头 - 类型要用()括起来 - ...

  6. 【原】Java学习笔记008 - 方法(函数)

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 方法/函数 Met ...

  7. for循环的运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 与 自己创建函数取值 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根

    今天学习的是for循环,对for循环的运算有了理解. document.write(" ")里的内容在网页上展示出来 有名函数非常重要!!!!!!!!!!!!!!!!!!!!!并且 ...

  8. flex检查对象是否存在某个方法(函数)、属性的最简方法

    //if("方法/属性名" in object){存在do...}else{不存在do...}if("data" in event.tagert)//只要使用这 ...

  9. python 全栈开发,Day113(方法和函数的区别,yield,反射)

    一.方法和函数的区别 面向对象 初级 class StarkConfig(object): def __init__(self,model_class): self.model_class = mod ...

随机推荐

  1. 高性能JavaScript(高性能Ajax)

    ajax是一种与服务器通信而无需重载页面的方法(即局部刷新.) 高性能的Ajax应该考虑数据传输技术和数据格式,以及其他的如数据缓存等优化技术. 请求数据 请求数据的常用技术有XMLHttpReque ...

  2. Redis Linux版安装详解

    Redis介绍 我的Linux系统是CentOS7 1.安装Redis 官方下载地址:http://download.redis.io 使用Linux下载:wget http://download.r ...

  3. FineBI表单如何更新

    FineBI表单如何更新 1. 描述Cube单表更新,是指在某个业务包上面设置定时更新,在某个固定的时间点对某个的业务包中的特定表进行数据更新,部分更新分为两种,全量更新和增量更新,因而在更新策略上则 ...

  4. Android系统启动流程(四)Launcher启动过程与系统启动流程

    此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...

  5. Linux下动态链接库加载路径

    引子 近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题: "error while loading shared libraries" 这是 ...

  6. 存储过程使用 in 添加多个参数的情况处理方式【转】

    原文连接:http://www.jb51.net/article/41472.htm -->情景 ① 通过刚才的SQL递归方式,我们已经可以将一个组织机构和其全部下级单位查询出来:假设每个组织机 ...

  7. 转:SqlServer索引及优化详解

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  8. db2错误代码大全

    ---恢复内容开始--- sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系 ...

  9. 【转】Redis学习---NoSQL和SQL的区别及使用场景

    什么是NoSQL NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,它具有非关系型.分布式.不提供ACID的数 ...

  10. 【10】python窗口控制[隐藏,移动]

    步骤一:下载小软件,如下图 该软件用于提取需要控制程序窗口的具体信息 二.程序代码 #__author:"**佳" #date: 2018/10/20 0020 #function ...