Scala学习(三)---函数式编程

news/2024/11/25 17:27:13/

文章目录

  • 1.面向对象编程
  • 2. 函数式编程是什么
  • 3.函数定义
  • 4.函数参数的特殊用法
  • 5.函数至简原则
  • 6.匿名函数
      • 6.1 匿名函数化简原则
  • 7.高阶函数
      • 7.1 函数可以作为值进行传递
      • 7.2 函数可以作为参数进行传递
      • 7.3 函数可以作为返回值进行传递
      • 7.4 柯里化写法

1.面向对象编程

Scala语言是一个完全面向对象的编程语言。万物皆是对象
对象的本质:对数据和行为的一个封装

2. 函数式编程是什么

在解决问题的时候,将问题分解成一个个的步骤,将每一个步骤进行封装(函数),通过调用这些封装好的步骤来解决问题。
Scala语言是一个完全函数式编程的语言。万物皆是函数。
函数的本质:函数可以当成一个值被传递。

3.函数定义

a.函数无参,无返回值

  def fun1(): Unit = {println("无返回值")}

b.无参,有返回值

    def fun2():String={"helloworld"}

c.有参,无返回值

      def fun3(name: String):Unit={println(s"你好,$name")}

d.有参,有返回值

    def fun4(name:String) :String={s"我是$name"}var str1=fun4("mao")println(str1)

e.多参,无返回值

    def fun5(name:String,age:Int):Unit={println(s"我是$name,今年$age 岁了")}

d.多参,有返回值

    def fun6(name:String,age:Int):String={s"我是$name,今年$age 岁了"}var str2=fun6("mao",18);println(str2)

4.函数参数的特殊用法

可变参数,在参数后加*

    def sayhi(names:String*):Unit={println(s"hi $names")}sayhi()sayhi("zhangsan")sayhi("lisi","zhangsan")

在这里插入图片描述

如果参数列表中存在多个参数,那么可变参数的位置一般放置在最后

    def sayhi(age:Int,names:String*):Unit={println(s"hi $names")}

参数默认值,一般将带有默认值的参数放置在参数列表的后面

	//设置参数默认值def sayhi(names:String="mao"):Unit={println(s"hi $names")}sayhi()//将带有默认值的参数放置在参数列表最后def sayhi(names:String,age:Int=31):Unit={println(s"hi $names,$age")}sayhi("mao")

带名参数
如果带有默认值的参数没有放置在参数列表的最后,name在调用函数的时候,需要使用带名参数来调用

   def sayhi(age:Int=31,names:String):Unit={println(s"hi $names,$age")}sayhi(names = "mao")

5.函数至简原则

return可以省略,scala会使用函数体的最后一行代码最为返回值
如果函数体只有一行代码,可以省略花括号
返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
如果有return,则不能省略返回值类型,必须指定
如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用
scala如果期望是无返回值类型,可以省略等号
如果函数式无参的,但是声明了参数列表,那么在调用的时候,小括号可加可不加
如果函数没有参数列表,那么小括号可以省略,调用时候小括号必须省略
如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

6.匿名函数

下面就是一个未化简的匿名函数的示例:

    val function1: (String, Int) => String = (name: String, age: Int) => age + name + "heihei"val str = function1("mao", 18)println(str)

在这里插入图片描述
真正的函数是这样的:

def function1(name:String,age:Int):String={age+name+"heihei"
}
val str = function1("mao", 18)
println(str)

6.1 匿名函数化简原则

参数的类型可以省略,会根据形参进行自动的推导

    //通过参数的类型推断返回值的类型val function2=(name:String)=>name+"heihei"//通过返回值的类型推断参数的类型val function3:String=>String= (name) => name+"heihei"

类型省略之后,发现只有一个参数,则圆括号可以省略,其他情况:没有参数和参数超过1的永远不能省略圆括号。

 val function3:String=>String= name=> name+"heihei"

匿名函数如果只有一行,则大括号也可以省略
如果参数只出现一次,则参数省略且后面参数也可以用_代替

val function4:(Int,Int)=>Int=2*_+4*_

7.高阶函数

7.1 函数可以作为值进行传递

  def sayHi(name:String) : String={println(s"hi $name")name}//此时不是作为值进行传递,而是将方法的返回值传递给了变量val mao:String=sayHi("mao")//此时才是将函数作为值传递val func1: String => String = sayHi _

7.2 函数可以作为参数进行传递

格式如下:
函数(函数名:(参数类型)=>返回值类型):返回值类型={}

//示例:def operXY(x: Int, y: Int, func: (Int, Int) => Int): Int = {func(x, y)}//调用函数,使用匿名函数作为参数值val countResult: Int = operXY(10, 20, (x: Int, y: Int) => x + y)//或者化简为val countResult: Int = operXY(10, 20,_+_)println(countResult)

运行结果:
在这里插入图片描述
通过scala语言的此特点,可以极大的简化Java语言手写MapReduce的过程

    def mapreduce(data:String,map: (String)=>Int,reduce:(Int)=>String): String = {//使用map读取数据val i = map(data)//走shuffleprintln("走shuffle流程")//对shuffle后的数据进行聚合val result:String=reduce(i)result}//调用mapreduce("hello world",(data:String)=>data.length,(data:Int)=>data+"reduce之后")

运行结果:
在这里插入图片描述

7.3 函数可以作为返回值进行传递

    //函数可以作为返回值进行传递def sumXY(x:Int)={def sumY(y:Int):Int={x+y}//将内部定义的函数作为返回值进行返回sumY _}//提供第一个累加的数val func=sumXY(10)//提供第二个累加的数val result = func(20)println(result)

运行结果:
在这里插入图片描述

7.4 柯里化写法

    //2.定于一个函数,传入三个参数c:char,s:String,i:Int//如果三个参数为('0',"",0),返回false,否则返回truedef func1(c:Char):String=>(Int=>Boolean)={def func2(s:String):Int=>Boolean={def func3(i:Int):Boolean={(c!='0'||s!=""||i!=0)}//将func3作为返回值返回func3 _}//将func2作为返回值返回func2 _}val function:String=>Int=>Boolean = func1('1')val function1:Int=>Boolean = function("b")val bool:Boolean = function1(10)println(bool)

在这里插入图片描述
使用柯里化写法对其进行简化:

    //柯里化写法def function6(c:Char)(s:String)(i:Int):Boolean={(c!='0'||s!=""||i!=0)}//调用val bool1 = function6('1')("a")(1)println(bool1)

http://www.ppmy.cn/news/83494.html

相关文章

【案例教程】R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件,以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛,数据常多样而复杂。利用R语言进行多元统计分析,从复杂的现象中发现规律、探索机制正是R的优势。为此,本课程以鱼类、昆虫、水文、地形等多样…

【个人笔记】真寻bot部署记录+源码食用记录

安装 0. 系统配置 Centos v8.2 1. 安装 使用真寻bot https://github.com/zhenxun-org/zhenxun_bot-deploy bash <(curl -s -L https://raw.githubusercontent.com/zhenxun-org/zhenxun_bot-deploy/master/install.sh)选择1&#xff0c;安装go-cqhttp和zhenxun_bot&…

计算机图形学 | 实验十一:阴影计算

计算机图形学 | 实验十一&#xff1a;阴影计算 计算机图形学 | 实验十一&#xff1a;阴影计算帧缓冲创建一个帧缓冲纹理附件渲染缓冲对象附件总结 阴影映射算法思想深度贴图渲染阴影抗锯齿 assimp库结果 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&a…

Async/await详解

一、概念与背景 他是在ES8被提出的一种异步方式&#xff0c;它其实是promise的一种语法糖 二、 Async关键字 async 关键字用于快速声明异步函数 &#xff0c;可以用在函数声明、函数表达式、箭头函数和方法上 async function foo() {} let bar async function() {}; let…

linux CentOs 安装 docker

进入到我们的 linux 系统中&#xff0c;先查看是否已安装 docker 可以先尝试看一下 docker 版本&#xff1a; docker -v 然后提示了&#xff1a; -bash: docker: command not found 这就说明&#xff0c;没有 docker 这个命令。 还有一种&#xff0c;是查看 docker 服务状态…

Matlab:多目标约束优化问题测试集--LIR-COMP

多目标约束优化问题,是许多工程实际问题所需要解决的问题,针对这类问题,我们提出众多的智能算法来解决该类问题,比如差分进化算法、遗传算法、粒子群算法、分布式估计算法、蚁群算法等。 当涉及到多个目标和约束时,优化问题可能会变得更加复杂和具有挑战性。 然而,针对…

LiangGaRy-学习笔记-Day15

1、编写脚本 1.1、拓展&#xff1a;shell脚本语法 case语句&#xff1a; 主要用于做选择的&#xff1b;多条件、多分支结构&#xff1b; case语句注意事项 case行尾必须以单词“in”&#xff0c;每一模式必须以单个右括号")"结束双分号";;"表示命令序…

单片机GD32F303RCT6 (Macos环境)开发 (二十七)—— 蓝牙透传模块HC-08的调试

蓝牙透传模块HC-08的调试 1、模块为汇承HC-08&#xff0c;GD32我们之前已经把usart1 配置成了dmaidle的方式接收数据&#xff0c;我们的hc-08模块连接的就是这一路usart。 所以&#xff0c;与GD32的连接比较简单&#xff0c;如下图&#xff1a; GD32 HC-08 TX(PA2 ) RX RX(PA3…