Scala(三)【函数式编程】
一.方法和函数
1.方法
1)基本语法
def 方法名(参数名:参数类型,...):返回值类型 = {方法体}
示例
def add(x: Int, y: Int): Int = {
x + y
}
2)简化原则
1、方法体中只有一行语句的时候,{ }可以省略
示例
def add(x: Int, y: Int): Int = x + y
2、如果将方法体中最后一行表达式作为方法的返回值,返回值类型可以省略
示例
def add(x: Int, y: Int) = {
x + y
}
注意
方法体中有return,必须定义方法的返回值类型
递归方法必须定义返回值类型
3、如果方法不需要返回值, =可以省略
示例
def func(x: Int) {
print(x)
}
4、如果方法不需要参数,()可以省略
示例
def func1 = {
print("hello world")
}
注意
如果定义方法的时候,没有(),在调用的时候也不能带上()
如果定义方法的时候有(),调用方法的时候()可有可无
=、()、{}不能够同时省略
3)方法参数
1.默认参数
在定义方法的时候,可以给参数一个默认值,后续在调用方法的时候,有默认值的参数就可以不用传参
示例
def add(y: Int,x: Int = 2, y: Int = 3) = {
x + y + z
}
//不赋值使用默认值
add(3)
2.带名参数
指定将值传递给哪个参数
add(x=3,y=4)
3.可变参数
定义func,address参数可变
def func(name:String,address:String*) ={
print(s"name:${name},address:${address}")
}
调用可以函数,不能直接传递数组,要通过 数组名:_* 的形式传递
val arr = List("北京市","丰台区","槐房村")
func("zhangsan",arr:_*)
add(x=3,y=4)
注意
可变参数必须放在参数列表的最后
可变参数不能与默认值、带名参数一起使用
2.函数
语法: val 函数名 = (参数名:参数类型,..) => {函数体}
简化: 函数体中只有一行语句的时候,{}可以省略
示例
val func = (x:Int,y:Int) => x+y
3.方法和函数的区别
1)方法可以重写,函数不可用重写
2)方法是存在于方法区,函数存在堆中
3)方法可以转成函数,函数不能转成方法。
方法转函数: 方法名 _
// add方法
def add(x: Int = 2, y: Int = 3) = {
x + y
}
//将add方法转fun函数
val fun = add _
但是在Scala中,函数和方法没有明确的界定:方法就是函数,函数也是对象
二.高阶函数
定义:方法/函数
的 参数/返回值
是一个函数
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
// 定义函数
val add = (x:Int,y:Int) => x+y
// 调用高阶函数fun1
println(fun1(1, 2, add))
三.匿名函数
定义:没有名字的函数,一般作为值进行传递
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
//_+_: 简写(x:Int,y:Int)=>(x=y)
fun1(1,2,_+_)
四.柯里化
定义: 有多组参数列表的方法称之为柯里化方法
示例
def m1(x:Int)(y:Int,z:Int) = x+y+z
演变过程
def fun1(x:Int):(Int,Int) => Int ={
(y:Int,z:Int) => x +y+z
}
fun1(1)(2,3)
五.闭包
定义: 函数体中使用不属于函数本身的变量,这样的函数称之为闭包
示例
val x = 10
val func = (y:Int) => x+y
Scala(三)【函数式编程】的更多相关文章
- Scala:函数式编程之下划线underscore
http://blog.csdn.net/pipisorry/article/details/52913548 python参考[python函数式编程:apply, map, lambda和偏函数] ...
- Scala函数式编程(三) scala集合和函数
前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
- Scala入门系列(九):函数式编程
引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...
- Scala入门系列(十):函数式编程之集合操作
1. Scala的集合体系结构 Scala中的集合体系主要包括(结构跟Java相似): Iterable(所有集合trait的根trait) Seq(Range.ArrayBuffer.List等) ...
- 5. Scala函数式编程的基础
5.1 函数式编程内容及介绍顺序说明 5.1.1 函数式编程内容 -函数式编程基础 函数定义/声明 函数运行机制 递归(难点,[最短路径,邮差问题,迷宫问题,回溯]) 过程 惰性函数和异常 -函数式编 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- (数据科学学习手札48)Scala中的函数式编程
一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...
- 9、scala函数式编程-集合操作
一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...
随机推荐
- F. Mattress Run 题解
F. Mattress Run 挺好的一道题,对于DP的本质的理解有很大的帮助. 首先要想到的就是将这个拆成两个题,一个dp光求获得足够的夜晚的最小代价,一个dp光求获得足够的停留的最小代价. 显然由 ...
- Codeforces 1009E Intercity Travelling | 概率与期望
题目链接 题目大意: 一个人要从$A$地前往$B$地,两地相距$N$千米,$A$地在第$0$千米处,$B$地在第$N$千米处. 从$A$地开始,每隔$1$千米都有$\dfrac{1}{2}$的概率拥有 ...
- "简单"的优化--希尔排序也没你想象中那么难
写在前边 大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 不过这篇文章呢,还是想跟大家聊一聊数据结构与算法,学校也是大二上才开设了数据结构这 ...
- JDK 之 HttpClient(jdk11)
HttpClient 简介 java.net.http.HttpClient 是 jdk11 中正式启用的一个 http 工具类(其实早在 jdk9 的时候就已经存在了,只是处于孵化期),官方寓意为想 ...
- PLSQL 删表 恢复
1.查看你删除的是哪张表(SQL 中的时间是删表时的时间 (我删表的时间 大概是:2019-08-16 08:47:00 之后 )): select * from user_recy ...
- A Modified Particle Swarm Optimizer
A Modified Particle Swarm Optimizer 一种改进的粒子群优化算法 Yuhui Shi and Russell Eberhart 1998 摘要: 本文在原有的粒 ...
- Linux可执行文件格式-ELF结构详解
表1. ELF文件类型分类 ELF文件类型 说明 实例 Relocatable File 可重定位文件 未链接之前的ELF文件,可用于链接可执行文件或静态链接库 Linux下的".o&quo ...
- Java 处理表格,真的很爽!
一个简单又快速的表格处理库 大家好,我是鱼皮. 处理 Excel 表格是开发中经常遇到的需求,比如表格合并.筛选表格中的某些行列.修改单元格数据等. 今天给大家分享一个 Java 处理表格的工具库,不 ...
- javascript-初级-day05js函数传参
JS基础-01 函数传参.参数类型-1 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conten ...
- 通过Rainbond的团队管理去管理已有的组织架构
针对于多团队管理我先列举几个小问题,看看大家有没有共鸣,我们在刚刚接触并使用Rainbond的时候,仅仅创建一个团队,里面创建一大堆应用,看起来特别乱,进行管理的时候呢,也会非常麻烦,尤其是当团队需要 ...