scala05-函数式编程02

news/2024/4/28 3:50:49/文章来源:https://blog.csdn.net/guo20082200/article/details/137119072

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

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}
}

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

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

相关文章

MySQL创建表:练习题

练习题: 创建一个名为"students"的数据库,并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表,包含以下字段: id: 整数类型 name: 字符串类型,学生姓名 subject: 字符串…

最小可行产品需要最小可行架构——可持续架构(三)

前言 最小可行产品(MVP)的概念可以帮助团队专注于尽快交付他们认为对客户最有价值的东西,以便在投入大量时间和资源之前迅速、廉价地评估产品的市场规模。MVP不仅需要考虑产品的市场可行性,还需要考虑其技术可行性,以…

计算机专业学习单片机有什么意义吗?

玩单片机跟玩计算机区别还是很大的, 单片机有众多的种类,每一种又可能有很多个系列.可以说单片机就是为了专款专用而生的.这样来达到产品成本的降低,这就是现在身边的很多的电子产品价格一降再降的原因之一.在开始前我有一些资料,是我根据网友给的问题精心整理了一…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…

SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404

问题描述 SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404 解决办法 启动类中ComponentScan(basePackages {“com.afclab”})中的扫包路径和项目路径不一样,导致扫不到Controller等组件,修改成和项目路径一样就可以解决&#xf…

8、鸿蒙学习-HAR

HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上。只能作为应用模块的依赖项被引用。 一、创建…

206基于matlab的无人机航迹规划(UAV track plannin)

基于matlab的无人机航迹规划(UAV track plannin)。输入输出参数包括 横滚、俯仰、航向角(单位:度);横滚速率、俯仰速率、航向角速率(单位:度/秒);飞机运动速度——X右翼、…

小美的平衡矩阵(前缀和例题)

2024美团秋招,被这一题给难住了 美团校招笔试真题_Java工程师、C工程师_牛客网 题目: 解答: 这道题的关键点就是要计算出以某一点为矩阵右下角时,1的个数 我一开始是想着遍历,以某一点为起点(矩阵左上角&a…

Github万星项目lobe-chat,连接GPT4GPTs,平替chatgpt-plus

简介 Lobe Chat - 一个开源、高性能的聊天机器人框架,支持语音合成、多模态和可扩展的函数调用插件系统。支持一键免费部署您的私人 ChatGPT/LLM Web 应用程序。 项目地址: GitHub - lobehub/lobe-chat: 🤯 Lobe Chat - an open-source, mo…

稀碎从零算法笔记Day32-LeetCode:每日温度

算是引出“单调栈”这种数据结构,后面会用这个思想处理下接雨水问题 前言:单调栈模式匹配——题目中提到“求第一个最大/最小的元素” 题型:栈、单调栈、数组 链接:739. 每日温度 - 力扣(LeetCode) 来源…

Eclipse+Java+Swing实现斗地主游戏

一. 视频演示效果 java斗地主源码演示 ​ 二.项目结构 代码十分简洁,只有简单的7个类,实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类,继承之JFrame,JFrame 是 Java Swing 库中的一个类,用于创建窗…

深度学习500问——Chapter05: 卷积神经网络(CNN)(1)

文章目录 5.1 卷积神经网络的组成层 5.1.1 输入层 5.1.2 卷积层 5.1.3 激活层 5.1.4 池化层 5.1.5 全连接层 5.2 卷积在图像中有什么直观作用 5.3 卷积层有哪些基本参数 5.4 卷积核有什么类型 5.5 二维卷积与三维卷积有什么区别 卷积神经网络是一种用来处理局部和整体相关性的计…

Unity图集编辑器

图集编辑器 欢迎使用图集编辑器新的改变编辑器图片 欢迎使用图集编辑器 Unity图集操作很是费劲 无法批量删除和添加图集中的图片 新的改变 自己写了一个图集编辑器 客: 支持批量删除 左键点击图片代表选中 右键点击图标定位到资产支持批量添加 选中图片拖拽到编…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

iOS开发进阶(十一):ViewController 控制器详解

文章目录 一、前言二、UIViewController三、UINavigationController四、UITabBarController五、UIPageViewController六、拓展阅读 一、前言 iOS 界面开发最重要的首属ViewController和View,ViewController是View的控制器,也就是一般的页面,…

蛋糕店怎么弄一个微信小程序_开启蛋糕店新篇章

微信小程序,开启蛋糕店新篇章——甜蜜触手可及 在这个数字化、智能化的时代,微信小程序以其便捷、高效的特点,成为了众多商家与消费者之间的桥梁。对于蛋糕店而言,拥有一个专属的微信小程序,不仅可以提升品牌形象&…

HTTP状态 405 - 方法不允许

方法有问题。 用Post发的请求&#xff0c;然后用Put接收的。 大家也可以看看是不是有这种问题 <body><h1>HTTP状态 405 - 方法不允许</h1><hr class"line" /><p><b>类型</b> 状态报告</p><p><b>消息…

Gitlab CI---could not read username for xxx: no such device or address

0 Preface/Foreword 项目开发中&#xff0c;经常会使用第三方的算法或者功能&#xff0c;那么就需要把对应的repo以子模块的方式添加到当前repo中。 添加命令&#xff1a; git submodule add <URL> 1 问题表现 子模块添加成功&#xff0c;但是GitLab CI阶段&#xff…

2024最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包

引言 在移动应用程序的开发中&#xff0c;了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法&#xff0c;可以让我们分析应用程序的网络请求和响应&#xff0c;了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具&#xff0c;可以帮助我们在 Android …

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…