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. 打开和写入excel文件

    一.使用win32读取excel内容 # -*- coding: utf-8 -*- from win32com import client as wc def open_excel(): excel ...

  2. Centos7部署kubelet(六)

    1.二进制包准备将软件包从linux-node1复制linux-node2.linux-node3中去 [root@linux-node1 ssl]# cd /usr/local/src/kubern ...

  3. innerHTML和innerText的区别,以及select元素中怎么取出被选中的option。

    一.innerHTML和innerText的区别. 元素.innerHTML = 字符串,是将一对或一个标签所标识的内容全部替换为所赋予的字符串,如果字符串中有标签,浏览器将自动识别其中的标签. 元素 ...

  4. MySQL:常用的数据模型

     常用的数据模型 一.定义 数据模型是对现实世界数据特征的抽象:通俗的讲数据模型就是现实世界的模拟: 数据模型是严格定义的一组概念的集合 是用来抽象.表示和处理现实世界中的数据和信息的工具 是对现实世 ...

  5. shell脚本实例-判断主机存活 以及企业备份方案

    1.上次写了一个脚本我那次考虑不是很周全,这次我将脚本改动了一下,这次是判断三次, 希望关注我的人可以经常交流哈.下面我写上代码. #!/usr/bin/bash while read ip do f ...

  6. golang切片类型

    切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 ...

  7. FileInputStream类与FileOutputStream类

    FileInputStream类是InputStream类的子类.他实现了文件的读取,是文件字节输入流.该类适用于比较简单的文件读取,其所有方法都是从InputStream类继承并重写的.创建文件字节 ...

  8. json2的基本用法

    <script type="text/javascript" src="/CoreResource/JS/json2.min.js"></sc ...

  9. MongDB篇,第一章:数据库知识1

    MongDB    数据库知识1 程序 =  数据结构 + 算法 数据存储阶段 1,文件管理阶段 (.txt .doc .xls) 优点: 数据可以长期保存:可以存储大量的数据:使用简单     缺点 ...

  10. Mysql/Mariadb配置日志

    1. 创建日志存放目录: mkdir /var/log/mysql && chown mysql:mysql /var/log/mysql 2.修改Mysql配置日志: vi /etc ...