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

news2024/11/26 4:29:12

文章目录

  • 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)
      //走shuffle
      println("走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,否则返回true
    def 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.coloradmin.cn/o/513683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Uncaught SyntaxError: Unexpected reserved word

解决思路: 首先,我运行项目报错,我查看了一下node版本,是否太低, 如果是14版本的话,那么node需要升级, 目前,node已经升级到19,升级到16即可,无需太高 更…

❤ 微信原生小程序的使用

❤ 微信原生小程序的使用 运行提示: Provisional headers are shown 微信小程序请求远程服务器接口时,响应非常慢,最后请求超时,导致失败。网络那里提示 provisional headers are shown警告 原因: 原因有很多&#…

什么人间悲剧,面试被刷了还要被HR怼.....

前一阵子向朋友诉苦,我在参加字节跳动面试的时候被面试官怼得哑口无言,场面让我一度十分尴尬。 印象最深的就是下面几个问题: 根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解? 非关系型数据库和关系型…

内网:bloodhound域渗透分析工具

目录 neo4j window下载 社区版neo4j kali下载 BloodHound BloodHound 使用 介绍: 利用BloodHound对庞大内网域环境进行自动化信息搜集并整理分析数据,提高渗透效率。BloodHound是一款可视化图形分析域环境中的关系的工具,…

ES 权威指南

一、检索文档 1.1 检索文档的一部分 通常, GET 请求将返回文档的全部, 存储在 _source 参数中。 但是可能你感兴趣的字段只是 title 。 请求个别字段可以使 用 _source 参数。 多个字段可以使用逗号分隔: GET /website/blog/123?_sourcetit…

ios 打包静态库

前言: 各位同学大家, 有段时间没有跟大家见面了。 相信很多做IOS手游sdk 的同学 都会用到静态库, 我们不用把我们都源代码都发给对接方 就可以把我们的逻辑跟研发都代码融合在一起 具体实现: 第一步 点击file 第二步创建一个p…

ES6中将非数组转换为数组的三种方法

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 我们常常想使用数组的方法,比如forEach,filter,又或者so…

解决 CentOS 7 内核安全漏洞 CESA-2018:3651 报错

如果你的 CentOS 7 服务器在安全测试时出现 kernel (CESA-2018:3651) 报错,那么您的服务器存在内核安全漏洞,需要更新修补。本文将介绍如何解决这个问题。 查看当前内核版本 在进行内核更新之前,您需要先查看当前服务器所使用的内核版本。可…

本地部署 MiniGPT-4

本地部署 MiniGPT-4 1. 什么是 MiniGPT-42. Github 地址3. 安装 MiniGPT-44. 准备预训练的 MiniGPT-4 checkpoint5. 在本地启动演示其他 1,安装 CUDA Toolkit 11.8其他 2,安装 GCC 9 版本,并设置为默认GCC版本其他 3(成功),重新安…

Shell脚本管道符常用搭配命令(我在人间贩卖黄昏,只为收集世间温柔去见你)

文章目录 1.sort2.uniq3.tr5.split6.paste7.eval 1.sort sort命令——以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort [选项] 文件名 cat file …

Java版企业电子采购招标系统源码

一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…

UNIAPP实战项目笔记65 获取当前用户购物车数据的前端和后端交互

UNIAPP实战项目笔记65 获取当前用户购物车数据的前端和后端交互 思路 构建数据库表 前端数据存入vuex中shop.js的list中 list自动同步到后端数据&#xff0c; 后端相应前端请求数据 实例截图 ##代码 前端代码首批cart.vue <template><view class"shop-cart&quo…

两种知识库软件:BookStack和DokuWiKi在Debian12中的安装

一、BookStack的安装 1. 架设 LNMP系统环境 Debian12、php8.2-fpm、 nginx 2. 下载bookstack源码 3. 按照官网说明进行手动安装。 注意1&#xff1a;composer命令的安装&#xff0c;针对php的命令 下载、更名、安装 wget https://getcomposer.org/installer mv installer…

AI文章创作助手有什么特点

在当今信息爆炸的时代&#xff0c;文章创作已成为各行业必备技能。然而&#xff0c;如何高效地创作出质量优异且独具创意的文章仍是一个艰巨的挑战。AI文章创作助手应势而生&#xff0c;利用领先的自然语言处理和知识图谱技术&#xff0c;拥有丰富的自动创作和辅助创作能力&…

江苏省国家密码管理局副局长刘书伦等一行莅临通付盾调研

5月10日下午&#xff0c;江苏省国家密码管理局副局长刘书伦&#xff0c;苏州市国家密码管理局局长李家全、副局长王安方&#xff0c;苏州工业园区管委会党政办副主任陆万良等一行莅临通付盾&#xff0c;就密码及安全相关工作进行调研指导&#xff0c;通付盾创始人、CEO汪德嘉博…

Java框架学习04(SpringBoot自动装配原理)

1、什么是 SpringBoot 自动装配&#xff1f; 2、SpringBoot 是如何实现自动装配的&#xff1f;如何实现按需加载&#xff1f; 3、如何实现一个 Starter&#xff1f; 前言 使用过 Spring 的小伙伴&#xff0c;一定有被 XML 配置统治的恐惧。即使 Spring 后面引入了基于注解的配…

【Apifox】token的使用方式和脚本示例

目录 一、手动登录获取token 二、全自动登录实现方式 期望效果 实现思路 公共脚本示例 前言&#xff0c;关于token的使用&#xff0c;仅做了简单的demo测试token效果。 一、手动登录获取token 顾名思义&#xff0c;因为只有登录之后才有token的信息&#xff0c;所以在调…

最近遇到的2个问题:cd换路径失败以及sqli抓包失败

问题1&#xff1a;用cd的时候&#xff0c;仅仅输出所打内容&#xff0c;但是跳转失败 解决方法&#xff1a;添加强制跳转参数 /d 原来是&#xff1a; 改完之后&#xff1a; 如果仅仅是盘符之间的切换&#xff0c;可以不使用cd命令直接跳转磁盘&#xff0c;就是直接输入…

洗地机怎么选?高性价比家用洗地机推荐

洗地机是一款高效、智能的清洁设备&#xff0c;可轻松去除地面污渍&#xff0c;免除了传统清洁方式的繁琐和费时。采用高科技材料和技术&#xff0c;可快速有效地将地面污物清除&#xff0c;保持环境卫生和清爽。但是面对市场上众多的洗地机品牌&#xff0c;许多家人们都不知道…

从接口测试到自动化测试:企业级接口自动化测试实践详解

从入门到精通&#xff01;企业级接口自动化测试实战&#xff0c;详细教学&#xff01;&#xff08;自学必备视频&#xff09; 摘要&#xff1a; 本文将使用Python中的requests库进行接口自动化测试&#xff0c;通过编写测试用例、封装请求方法等步骤&#xff0c;实现简单的接口…