scala05-函数式编程02

函数式编程-函数对象作为方法的参数

package com.zishi.scala.a02.okk05/*** 将函数对象作为方法的参数来使用,* 函数本身就是对象,* 对象的使用领域:变量,方法参数,返回值类型** 类比Java* public void test(User user) {* }** User user = new User();** test(user); 对象作为方法的参数* test(new User());*/
object Test05_Lambda01 {def main(args: Array[String]): Unit = {// 创建方法对象def fun33(age: Int): String = {"Hello:" + age}/***  等同于*  def test(f: Function1[Int, String]) : Unit = {}*/def test(f: (Int) => String): Unit = {println(f(23))}val f2 = fun33 _test(f2) // Hello:23def sum(x:Int, y:Int): Int = {x + y}def sub(x: Int, y: Int): Int = {x - y}def test2(fun: (Int, Int) => Int): Unit = {val i = fun(10, 20)println(i)}// 将函数名称作为参数传递为一个函数作为参数,此时不需要下划线test2(sum)//TODO: 这里函数的名称sub真的很重要吗?// 类比Java:test(new User())test2(sub)// TODO: 将参数传递的名字取消掉// 如果函数声明没有def和名称,那么就是匿名函数test2((x: Int, y: Int) => {x * y})// 将匿名函数赋值给一个变量val a = (x: Int, y: Int) => {x / y}test2(a)// 匿名函数的简化原则//(1)参数的类型可以省略,会根据形参进行自动的推导test2((x, y) => {x * y})//(2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号。//(3)匿名函数如果只有一行,则大括号也可以省略test2((x, y) => x * y)//(4)如果参数只出现一次,并且按照顺序执行一次,则参数省略且后面参数可以用_代替println("-------------------")test2(_ * _) // 下划线类似占位符,第一个下划线代表第一个参数,依次类推//(5) 如果可以推断出,当前传入的println是一个函数体,而不是调用语句,可以直接省略下划线// 定义一个函数,以函数作为参数输入def f(func: String => Unit): Unit = {func("abcde")}f((name: String) => {println(name)})println("========================")// 匿名函数的简化原则//(1)参数的类型可以省略,会根据形参进行自动的推导f((name) => {println(name)})//(2)类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号。f(name => {println(name)})//(3)匿名函数如果只有一行,则大括号也可以省略f(name => println(name))//(4) 如果参数只出现一次,则参数省略且后面参数可以用_代替f(println(_))//(5) 如果可以推断出,当前传入的println是一个函数体,而不是调用语句,可以直接省略下划线f(println _)f(println)}
}

练习

package com.zishi.scala.a02.okk05object Test05_Lambda02 {def main(args: Array[String]): Unit = {// 实际示例,定义一个”二元运算“函数,只操作1和2两个数,但是具体运算通过参数传入def dualFunctionOneAndTwo(fun: (Int, Int) => Int): Int = {fun(1, 2)}val add = (a: Int, b: Int) => a + bval minus = (a: Int, b: Int) => a - bprintln(dualFunctionOneAndTwo(add))println(dualFunctionOneAndTwo(minus))// 匿名函数简化println(dualFunctionOneAndTwo((a: Int, b: Int) => a + b))println(dualFunctionOneAndTwo((a: Int, b: Int) => a - b))println(dualFunctionOneAndTwo((a, b) => a + b))println(dualFunctionOneAndTwo(_ + _))println(dualFunctionOneAndTwo(_ - _))println(dualFunctionOneAndTwo((a, b) => b - a))println(dualFunctionOneAndTwo(-_ + _))// Java里面存在引用类型和基本类型同时作为方法的参数 void test(int x, User u);// 类比javadef cal(x: Int, func: (Int, Int) => Int, y: Int) = {func(x, y)}def sum(x: Int, y: Int) = {x + y}println("....")println(cal(3,(x: Int, y: Int) => {x + y}, 5))println(cal(3, (x: Int, y: Int) => x + y, 5))println(cal(3, (x, y) => x + y, 5))println(cal(3, _ + _, 5))}
}

函数作为返回值

package com.zishi.scala.a02.okk05/*** 函数作为返回值返回* 类比Java* public User test() {* User user = new User();* return user;* }** public User test() {* return new User();* }*/
object Test05_Lambda03 {def main(args: Array[String]): Unit = {// 函数作为返回值返回def outer() = {def inner(): Unit = {print("abc")}inner _}val f1 = outer()f1()//下面的调用更诡异outer()() // abcprintln("...............")def outer2() = {//def inner(name: String): Unit = print(s"abc${name}")def inner(name: String): Unit = print(s"abc${name}")inner _}val f2 = outer2()f2("aege") // abcabcaegedef outer3(x: Int) = {def mid(f : (Int, Int) => Int) = {def inner(y: Int) = {f(x, y)}inner _}mid _}println()val mid = outer3(1)val inner = mid( _ + _)val res = inner(3)println(res)val res2 = outer3(1)( _ + _)(3)println(res2)}
}

高阶函数01

package com.zishi.scala.a02.okk05object Test06_HighOrderFunction01 {def main(args: Array[String]): Unit = {def f(n: Int): Int = {println("f调用")n + 1}val result: Int = f(123)println(result) // 124// 1. 函数作为值进行传递val f1: Int => Int = fval f2 = f _println(f1) // com.zishi.scala.okk05.Test06_HighOrderFunction$$$Lambda$16/0x00000008000d7040@1e67a849println(f1(12)) // 13println(f2) // com.zishi.scala.okk05.Test06_HighOrderFunction$$$Lambda$17/0x00000008000d6840@57d5872cprintln(f2(35)) // 36def fun(): Int = {println("fun调用")1}val f3: () => Int = funval f4 = fun _println(f3) // com.zishi.scala.okk05.Test06_HighOrderFunction$$$Lambda$18/0x00000008000d6040@64c87930println(f4) // com.zishi.scala.okk05.Test06_HighOrderFunction$$$Lambda$19/0x00000008000d6440@400cff1a}
}

高阶函数02


object Test06_HighOrderFunction02 {def main(args: Array[String]): Unit = {// 2. 函数作为参数进行传递// 定义二元计算函数def dualEval(op: (Int, Int) => Int, a: Int, b: Int): Int = {op(a, b)}def add(a: Int, b: Int): Int = {a + b}println(dualEval(add, 12, 35))println(dualEval((a, b) => a + b, 12, 35))println(dualEval(_ + _, 12, 35))// 3. 函数作为函数的返回值返回def f5(): Int => Unit = {def f6(a: Int): Unit = {println("f6调用 " + a)}f6 // 将函数直接返回}//    val f6 = f5()//    println(f6)//    println(f6(25))println(f5()(25))}
}object Test06_HighOrderFunction03 {def main(args: Array[String]): Unit = {// 3. 函数作为函数的返回值返回def f5(): Int => Unit = {def f6(a: Int): Unit = {println("f6调用 " + a)}f6 // 将函数直接返回}//    val f6 = f5()//    println(f6)//    println(f6(25))println(f5()(25))}
}

练习

package com.zishi.scala.a02.okk05/*** 函数作为返回值*/
object Test08_Practice {def main(args: Array[String]): Unit = {// 2. 练习2def func(i: Int): String => (Char => Boolean) = {def f1(s: String): Char => Boolean = {def f2(c: Char): Boolean = {if (i == 0 && s == "" && c == '0') false else true}f2}f1}println(func(0)("")('0'))//falseprintln(func(0)("")('1'))//trueprintln(func(23)("")('0'))//trueprintln(func(0)("hello")('0'))//true// 匿名函数简写def func1(i: Int): String => (Char => Boolean) = {s => c => if (i == 0 && s == "" && c == '0') false else true}println(func1(0)("")('0'))//falseprintln(func1(0)("")('1'))//trueprintln(func1(23)("")('0'))//trueprintln(func1(0)("hello")('0'))//true// 柯里化def func2(i: Int)(s: String)(c: Char): Boolean = {if (i == 0 && s == "" && c == '0') false else true}println(func2(0)("")('0'))//falseprintln(func2(0)("")('1'))//trueprintln(func2(23)("")('0'))//trueprintln(func2(0)("hello")('0'))//true}
}object Test08_Practice01 {def main(args: Array[String]): Unit = {// 1. 练习1val fun = (i: Int, s: String, c: Char) => {if (i == 0 && s == "" && c == '0') false else true}println(fun(0, "", '0'))//falseprintln(fun(0, "", '1'))//trueprintln(fun(23, "", '0'))//trueprintln(fun(0, "hello", '0'))//true}
}
package com.zishi.scala.a02.okk05/*** 函数作为返回值*/
object Test08_Practice {def main(args: Array[String]): Unit = {// 2. 练习2 内层函数可以使用外层函数的参数// func 参数列表:i: Int, 返回值类型(函数类型):String => (Char => Boolean)def func(i: Int): String => (Char => Boolean) = {// f1函数: 参数列表:s: String, 返回值类型:Char => Booleandef f1(s: String): Char => Boolean = {// f2函数: 参数列表:c: Char, 返回值类型:Booleandef f2(c: Char): Boolean = {if (i == 0 && s == "" && c == '0') false else true}f2}f1}println(func(0)("")('0'))//falseprintln(func(0)("")('1'))//trueprintln(func(23)("")('0'))//trueprintln(func(0)("hello")('0'))//truedef func33(i: Int): String => (Char => Boolean) = {// f1函数: 参数列表:s: String, 返回值类型:Char => Booleandef f1(s: String): Char => Boolean = {// f2函数: 参数列表:c: Char, 返回值类型:Boolean// def f2(c: Char): Boolean = if (i == 0 && s == "" && c == '0') false else true//def f2(c: Char) = if (i == 0 && s == "" && c == '0') false else true// val f2 = (c: Char) => if (i == 0 && s == "" && c == '0') false else true// c => if (i == 0 && s == "" && c == '0') false else truec => true}f1}def func44(i: Int): String => (Char => Boolean) = {// f1函数: 参数列表:s: String, 返回值类型:Char => Boolean//def f1(s: String): Char => Boolean = c => if (i == 0 && s == "" && c == '0') false else true//def f1(s: String) = (c:Char) => if (i == 0 && s == "" && c == '0') false else true//val f1 = (s: String) => (c:Char) => if (i == 0 && s == "" && c == '0') false else true//(s: String) => (c:Char) => if (i == 0 && s == "" && c == '0') false else trues => c => if (i == 0 && s == "" && c == '0') false else true}// 匿名函数简写def func1(i: Int): String => (Char => Boolean) = {s => c => if (i == 0 && s == "" && c == '0') false else true}println(func1(0)("")('0'))//falseprintln(func1(0)("")('1'))//trueprintln(func1(23)("")('0'))//trueprintln(func1(0)("hello")('0'))//true// 柯里化def func2(i: Int)(s: String)(c: Char): Boolean = {if (i == 0 && s == "" && c == '0') false else true}println(func2(0)("")('0'))//falseprintln(func2(0)("")('1'))//trueprintln(func2(23)("")('0'))//trueprintln(func2(0)("hello")('0'))//true}
}
  • 简化代码约定
package com.zishi.scala.a02.okk05/*** 函数至简原则注意事项*/
object Test08_Practice02 {def main(args: Array[String]): Unit = {def test(name: String, f: String => Unit): Unit = {f(name)}def func(name: String): Unit = {println("name:" + name)}// 1. 调用test("zbc", func)// 2. 化简test("zbc", (name: String) => println("name:" + name))//3, 化简test("zbc", name => println("name:" + name))//4, 下面的化简不对// _ 代表第二个参数,第二个参数是函数对象,并不是函数对象的参数test("zbc", _ => println("name:" + _)) //输出结果为:com.zishi.scala.a02.okk05.Test08_Practice02$$$Lambda$18/0x000000080009d840@2ea6137// 报错:type mismatch, 返回的是Unit// 这是因为这里使用的函数的嵌套。不确定下划线 _ 是哪层函数的简化// test("zbc",println("name:" + _))// 做个如下变形def test2(f: String => Unit): Unit = {f("测试变形")}def func2(name: String): Unit = {println("func2:" + name)}// 1. 化简test2((name: String) => println("func2:" + name))// 2. 化简test2(name => println("func2:" + name))//3. 简化test2(name => println(name))test2(println(_))test2(println _)test2(println)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790055.shtml

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

相关文章

「每日跟读」句型公式 第2篇

「每日跟读」句型公式 第2篇 1. I’m thinking about____ 我在考虑____ I’m thinking about my future career (我正在思考我未来的职业) I’m thinking about our marriage (我在考虑我们的婚姻) I’m thinking about taking a vacation (我在考虑度一个假) I’m think…

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包,然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…

人工智能上手 Pytorch

人工智能上手 Pytorch 1、人工智能框架历史走向 2015年, caffe,优势配置简单,缺点安装麻烦,且不更新维护 2016年,tensorflow 1.x,定义太严格,很复杂。开发成本高。简单的任务,也很…

[Python学习篇] Python创建项目

新建项目 打开开发工具 PyCharm 选择 New Project 目录结构如下 运行 hello world 选中项目,右键 New -> Python File 进行创建文件 运行项目

MYSQL数据库:告别慢查询,优化性能大揭秘

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 MYSQL数据库:告别慢查询,优化性能大揭秘 文章目录 一、揭秘…

OAuth 2.0(Open Authorization 2.0)授权框架入门介绍

拓展阅读 OAuth 2.0-01-Overview OAuth2-02-java 整合 OAuth2-03-springboot 整合 oauth2 是什么? OAuth 2.0(Open Authorization 2.0)是一种授权框架,允许第三方应用程序访问用户在另一个服务提供者上托管的资源&#xff0c…

2024.3.9力扣每日一题——找出数组的第 K 大和

2024.3.9 题目来源我的题解 题目来源 力扣每日一题;题序:2386 我的题解 对不起,打扰了,完全不会。还是自己看官方题解吧😄~

2024.(3.30和4.1)力扣刷题记录-二叉树学习记录2

一、学习视频 如何灵活运用递归?【基础算法精讲 10】_哔哩哔哩_bilibili 二、跟练代码 1. 100. 相同的树 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

Makefile:调用shell脚本和嵌套调用多项目编译(九)

1、Makefile中调用shell脚本 Makefile中可以通过使用$(shell 指令)的方式调用shell脚本a指令:输出当前文件夹下的所有文件b指令:输出当前路径c指令:如果当前目录下不存在abc文件那么创建一个abc的文件 a$(shell ls ./) b$(shell pwd) filen…

关于简单又挣钱的冷门美团项目,美团圈圈

大家好,最近美团又开始搞事情了。接连推出了好几个网推项目,让一大波人都吃上了肉了。 美团的项目很简单,就是给它们的活动做推广。用户只需要拿到它推广的链接,然后去扫码进群就可以了。只要用户保持8天不退就行了。 下面是体验…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近(2024年3月29日),号称比Python快6.8万倍的Mojo编程语言开源啦!6.8万倍?你敢相信这个数字是真的吗?不过,就连Mojo官网都把这个结果贴了出来(见下图),这就很…

Spring Boot的基础知识和应用

在快速发展的软件开发领域,Spring Boot已经成为了一个广受欢迎的框架,它极大地简化了Spring应用的初始搭建以及开发过程。Spring Boot遵循“约定优于配置”的原则,通过默认配置减少了开发者的配置工作量,使得开发者能够更专注于业…

线程池小项目【Linux C/C++】(踩坑分享)

目录 前提知识: 一,线程池意义 二,实现流程 阶段一,搭建基本框架 1. 利用linux第三方库,将pthread_creat线程接口封装 2. 实现基本主类ThreadPool基本结构 阶段二,完善多线程安全 1. 日志信息打印…

如何利用OceanBase v4.2的 Runtime Filter提升查询效率

OceanBase数据库中可使用Hash Join联接算法,这种算法可以依据某些字段对两个表进行等值匹配连接。然而,当涉及连接的表(特别是作为Probe Table的表)数据量较大时,Hash Join的性能会显著下降。针对这一问题,…

[蓝桥杯 2023 省 A]填空问题1

A. 幸运数 小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。例如 23142314 是一个幸运数字,因为它有 44 个数位,并且 23142314。现在请你帮他计算从 11 至 10000000010…

若依框架时间比较的坑(DATE_FORMAT)

背景 - 想做生日的比较 若依自带的比较 <if test"params.beginTime ! null and params.beginTime ! "><!-- 开始时间检索 -->AND date_format(u.create_time,%y%m%d) > date_format(#{params.beginTime},%y%m%d)</if><if test"params…

AJAX —— 学习(三)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08;…

java实现小程序授权登录以及获取手机号

1、引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.1.0</version></dependency>2、引入封装好的工具类 import cn.binarywang.wx.miniapp.api.WxMaS…

Opencv各个颜色空间、用途(颜色通道分割与合并)

Opencv各个颜色空间、用途&#xff08;颜色通道分割与合并&#xff09; OpenCV中提供了多种颜色空间&#xff0c;每种颜色空间都有其特定的用途。以下是一些常见的颜色空间及其用途&#xff1a; BGR颜色空间&#xff1a;BGR颜色空间是一种与计算机显示器显示的颜色相同的颜色…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…