1. 定义方法和函数

1.1. 定义方法


方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型

1.2. 定义函数

1.3.方法和函数的区别

在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面

package cn.toto.scala

/**
* Created by toto on 2017/6/27.
*/
object MethodAndFunctionDemo {
//定义一个方法
//方法m2参数要求是一个函数,函数的参数必须是两个Int类型
//返回值类型也是Int类型
def m1(f:(Int,Int) => Int) : Int = {
f(2,6)
} //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
val f1 = (x:Int,y:Int) => x + y
//再定义一个函数f2
val f2 = (m:Int,n:Int) => m * n //main方法
def main(args: Array[String]): Unit = {
//调用m1方法,并传入f1函数
val r1 = m1(f1) println(r1) //调用m1方法,并传入f2函数
val r2 = m1(f2)
println(r2)
}
}

运行结果:

8
12

1.2. 将方法转换成函数(神奇的下划线)

代码如下:

package cn.toto.scala

/**
* Created by toto on 2017/6/27.
*/
object TestMap { def ttt(f:Int => Int):Unit = {
val r = f(10)
println(r)
} val f0 = (x : Int) => x * x //定义了一个方法
def m0(x:Int) : Int = {
//传递进来的参数乘以10
x * 10
} //将方法转换成函数,利用了神奇的下滑线
val f1 = m0 _ def main(args: Array[String]): Unit = {
ttt(f0) //通过m0 _将方法转化成函数
ttt(m0 _); //如果直接传递的是方法名称,scala相当于是把方法转成了函数
ttt(m0) //通过x => m0(x)的方式将方法转化成函数,这个函数是一个匿名函数,等价:(x:Int) => m0(x)
ttt(x => m0(x))
}
}

-------------------------

package com.cx.spark.demo

object MethodAndFunction {
def main(args: Array[String]): Unit = {
println(timeUUId)
} //定义一个方法
//方法m2参数要求是一个函数,函数的参数必须是两个Int类型
//返回值类型也是Int类型
def m1(f: (Int, Int) => Int): Int = {
f (2, 6)
} //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
val f1 = (x: Int, y: Int) => x + y
//再定义一个函数f2
val f2 = (m: Int, n: Int) => m * n def max(a: Int, b: Int):Int = if (a > b) a else b //定义方法 val a: (Int, Int) => Int = max //max会隐士转化成函数,赋给变量(函数是一等公民),变量必须要指定参数类型
//val a: (Int, Int) => Int = max() //报错 var b = max _ //主动把方法转成函数,赋个变量,不用指定函数参数 var doubler = (x: Int) => x + 10 //定义函数 var c = doubler //函数间赋值 def hf():Int => Int = x => x+1 //定义一个方法,参数:空;返回值:参数为Int的函数
var d = hf() //调用函数,返回值(函数)赋给一个变量
var e = hf //括号省略了 //Partial Functions 偏函数 val pf : PartialFunction[Int , String] = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
}
val pf2 :Int => String = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
} def safeStringOp(s:String, f:String=>String) = {
if (s != null) f(s) else s
}
//匿名函数
val uuid = java.util.UUID.randomUUID().toString val timeUUId = safeStringOp(uuid,
{ s =>
val now = System.currentTimeMillis
val timed = s.take(24) + now
timed.toUpperCase
}
) }

  

Scala方法定义,方法和函数的区别,将方法转换成函数的更多相关文章

  1. Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能

    Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...

  2. UDF_表值函数与标量函数的区别_分割字符串成单个的字符并返回表(插入到表中)

    UDF_区别_分割字符串成单个的字符并返回表(插入到表中) /* SQL表值函数和标量值函数的区别 实验环境:SQL Server 2014,参考maomao365有改编 在sqlserver中存储过 ...

  3. JS中JSON.stringify()方法,将js对象(json串)转换成字符串,传入服务器

    JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串. 语法 JSON.string ...

  4. SQL Server ->> 利用CONVERT/STR/FORMAT函数把浮点型数据格式化/转换成字符串

    在SQL Server下想把数字(包括浮点型和整型)转换成字符串,保留数据原本的样子或者根据需要转换成另外指定的格式可能就不仅仅是一条CAST(XXXX AS NVARCHAR)这么简单的事情了. 无 ...

  5. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  6. SpringData系列三 Repository Bean 方法定义规范

    本节主要介绍Repository Bean中方法定义规范. 1.方法不是随便声明,需要符合一定的规范. 2.按照Spring Data的规范,查询方法以find|read|get开头,涉及条件查询时, ...

  7. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  8. python3中的 zip()函数 和python2中的 zip()函数 的区别

    python3中的 zip()函数 和python2中的 zip()函数 的区别: 描述: zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. ...

  9. 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器

    一.jQuery简介 1.0 JavaScript编程比较恶心的地方 恶心1:选择元素麻烦,全线兼容的方法只有getElementById()和getElementsByTagName()两个.其他的 ...

随机推荐

  1. 读书笔记 C# yield return与yield break执行顺序的浅析

    yield return可一次返回一个元素,并保留当前在代码中的位置,下次调用当前迭代器函数时,将从该位置从新执行.也就是说执行了yield return的时候,迭代器函数就返回了一个元素给forea ...

  2. 关于iOS设备的那些事

    首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick idfa: 获取方式 [ASIdentifierManager sharedMana ...

  3. 下载hibenate tools插件(百度搜hibenate tools 下载)

    Eclipse插件的安装和使用1.     在线更新( http://blog.csdn.net/charlies_fu/article/details/5638068)打开eclipse工具,选择H ...

  4. SQL-39 使用索引

    题目描述 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引.CREATE TABLE `salaries` (`emp_no` int( ...

  5. 第二节 java流程控制(判断结构+选择结构)

    Java的判断结构: 1.if(条件表达式){ 执行语句 }: 2.if(条件表达式){ 执行语句 }else{ 执行语句 } 3. if(条件表达式){ 执行语句 }else if(条件表达式){ ...

  6. Python基础学习(第4天)

    Python进阶 第1课:词典(dictionary) 1.词典可以存储多个元素,存储多个元素的对象称为容器(container) 第2课:文本文件的读取写入 1.打开一个文件,用对象来代表这个文件 ...

  7. Oracle中从控制文件读取的视图

    Oracle中有一些数据字典视图需从控制文件中读取信息,如下所示.用户在数据库打开之前就可以访问这些视图,因为这些视图的内容存储在控制文件中. v$archived_log:归档日志信息,如大小,SC ...

  8. day 29 socket 初级版

    # 客户端介绍简单版# import socket# #1买手机# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STR ...

  9. Python数据分析库pandas基本操作

    Python数据分析库pandas基本操作2017年02月20日 17:09:06 birdlove1987 阅读数:22631 标签: python 数据分析 pandas 更多 个人分类: Pyt ...

  10. random_select

    package sorttest;   //expected and worst running time is O(n),asuming that the elements are distinct ...