一.方法和函数

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(三)【函数式编程】的更多相关文章

  1. Scala:函数式编程之下划线underscore

    http://blog.csdn.net/pipisorry/article/details/52913548 python参考[python函数式编程:apply, map, lambda和偏函数] ...

  2. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  3. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  4. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  5. Scala入门系列(九):函数式编程

    引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...

  6. Scala入门系列(十):函数式编程之集合操作

    1. Scala的集合体系结构 Scala中的集合体系主要包括(结构跟Java相似): Iterable(所有集合trait的根trait) Seq(Range.ArrayBuffer.List等) ...

  7. 5. Scala函数式编程的基础

    5.1 函数式编程内容及介绍顺序说明 5.1.1 函数式编程内容 -函数式编程基础 函数定义/声明 函数运行机制 递归(难点,[最短路径,邮差问题,迷宫问题,回溯]) 过程 惰性函数和异常 -函数式编 ...

  8. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

  9. (数据科学学习手札48)Scala中的函数式编程

    一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...

  10. 9、scala函数式编程-集合操作

    一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

随机推荐

  1. java核心技术 第3章 java基本程序设计结构

    类名规范:以大写字母开头的名词 若由多个单词组成 每个单词的第一个字母应大写(驼峰命名法)  与.java文件名相同 运行程序:java ClassName(dos命令) 打印语句:System.ou ...

  2. k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)

    Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...

  3. Java测试开发--Java基础知识(二)

    一.java中8大基本类型 数值类型:byte.short.int .float.double .long 字符类型:char 布尔类型:boolean 二. 封装:将属性私有化,不允许外部数据直接访 ...

  4. 【机器学习基础】关于深度学习的Tips

    继续回到神经网络章节,上次只对模型进行了简要的介绍,以及做了一个Hello World的练习,这节主要是对当我们结果不好时具体该去做些什么呢?本节就总结一些在深度学习中一些基本的解决问题的办法. 为什 ...

  5. 问题 K: 找点

    题目描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你们帮帮他吗? 输入 多组测试数据. 每组数据先输入一个N,表示有N个闭区间(N ...

  6. 如何提高C# StringBuilder的性能

    本文探讨使用C# StringBuilder 的最佳实践,用于减少内存分配,提高字符串操作的性能. 在 .NET 中,字符串是不可变的类型.每当你在 .NET 中修改一个字符串对象时,就会在内存中创建 ...

  7. GoLang设计模式16 - 模板方法模式

    模板方法设计模式是一种行为型设计模式.这种模式通过常用于为某种特定的操作定义一个模板或者算法模型. 以一次性密码(OTP:One Time Password)为例.我们常见的一次性密码有两种:短信密码 ...

  8. [loj6033]棋盘游戏

    将棋盘黑白染色,即构成一张二分图 将状态用一张二分图$G$和一个点$x\in V$描述(分别为仍未被经过的点的导出子图和当前棋子所在位置),并称将要移动棋子的一方为先手 结论:先手必胜当且仅当$x$一 ...

  9. [bzoj4652]循环之美

    对于一个分数x/y(x和y互素),在k进制下为纯循环当且仅当y和k互素证明:任意一个分数都可以写成0.abbbbbbbb的形式(不妨假设a尽量短),设a的位数为l1,b的位数为l2,那么原分数即$\f ...

  10. 【性能优化】(2)JVM调优

    JVM调优 2019-07-21  12:32:00  by冲冲 1.