09_Scala函数和对象

devtools/2024/10/18 12:23:00/

文章目录

  • 函数和对象
  • 1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象
  • 2.将函数当作对象来用,也就是访问函数,但是不执行函数结果
  • 3.对象拥有数据类型(函数类型),对象可以进行赋值操作
  • 4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型
  • 5.Scala将对象作为参数,传入到另一个函数中,作为参数使用
  • 6.特殊情况函数当作对象使用,下划线可省; 函数以函数对象作为形参,统一下划线可省;
  • 7.形参为函数对象的 匿名写法
  • 8.Scala也可以将函数对象作为结果返回;

函数和对象

scala万物皆对象
scala是完全面向函数式编程语言,万物皆函数

scala__8">1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象

//    1.TODO 函数也是对象    scala中声明了一个函数 等价于声明一个函数对象def fun01()={}println(fun01)    //()    //调用时省略小括号

2.将函数当作对象来用,也就是访问函数,但是不执行函数结果

//    2.TODO 将函数当作对象来用,也就是访问函数,但是不执行函数结果println(fun01 _)    //_07函数和对象.Demo01$$$Lambda$5/245672235@4cdbe50fprintln((fun01 _).toString())    //_07函数和对象.Demo01$$$Lambda$6/2114694065@6debcae2

3.对象拥有数据类型(函数类型),对象可以进行赋值操作

  • 函数类型Function0[Unit] 0表示函数参数列表的个数
  • 中括号中 表示函数没有返回值;
  • 如果有一个参数有返回值的 函数类型 -->
  • def fun02(age:Integer):String={“zhangsan”}
  • var f1:Function1[Integer,String] = fun02 _ //Integer表示函数形参的类型,String表示函数返回值类型
  • 函数对象的参数最多支持22个 , 函数的参数的个数是无限个; //谁没事会写这么多?
var f:Function0[Unit] = fun01 _
println()def fun02(age:Integer):String={"zhangsan"}
var f1:Function1[Integer,String] = fun02 _
var f2:Function1[Integer,String] = fun02    //下划线可省
f2 = fun02    //下划线可省

4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型

    def fun03(name:String,age:Integer):Unit={println("xxx")}val f3:(String,Integer)=>Unit = fun03 _     //形参列表仅一个参数则,小括号可省//    且函数对象 可以直接执行f3("zhangsan",18)     //xxxf3      //这写法啥也不是没用   .函数可以省略(),但是对象不能省略()

5.Scala将对象作为参数,传入到另一个函数中,作为参数使用

//    案例:将test函数中传入User对象def sum(x:Int,y:Int):Int={x+y}def diff(x:Int,y:Int):Int={x-y}def test(f: (Int,Int)=>Int):Unit={val result = f(10, 20)println(result)}//基本调用println(sum(20, 30))    //50test(sum)     //30      //将函数对象作为参数使用,将我们的逻辑进行传递,但是逻辑不用写死;test(diff)    //-10      //使用什么逻辑作者来顶,内部执行即可;

6.特殊情况函数当作对象使用,下划线可省; 函数以函数对象作为形参,统一下划线可省;

  • 使用下划线的目的就是使函数不执行,而是当作对象使用,如果明确知道函数不执行,使用下划线即可;

  • 小结:只要明确形参是函数对象,下划线都可去*

7.形参为函数对象的 匿名写法

    test((x:Int,y:Int)=>{x+y})//匿名写法也就是调用函数的时候直接定义函数对象;仅保留形参列表 和 函数体,中间使用=>连接//    7.1同 函数的定义,函数的方法若仅有一行,那么花括号可以省略test((x:Int,y:Int)=> x+y)
//    7.2函数的参数类型由于和 test形参一致,所以参数类型可省     //关于小括号都别省test((x,y)=> x+y)//    7.3如果参数按照顺序只执行一次,那么可以使用下划线代替参数,省略参数列表test(_ + _)test(_ - _)   //下划线就表示第一参数,以此类推;

特殊情况:下划线不能嵌套使用

在这里插入图片描述

上述代码无法区分,下划线是作用println函数还是test函数

8.Scala也可以将函数对象作为结果返回;

    def outer()={def inner(): Unit = {println("inner")}inner _   //作为对象返回必须加下划线}var f11 = outer()f11()//    8.1特殊调用方法outer()()   //看上述代码 outer()其实就是f11 对象,对象加括号就可以执行函数逻辑

全局代码

scala">package _07函数和对象object Demo01 {def main(args: Array[String]): Unit = {/**scala万物皆对象scala是完全面向函数式编程语言,万物接函数->  函数就是对象,对象就是函数1.函数也是对象    scala中声明了一个函数 等价于声明一个函数对象2.将函数当作对象来用,也就是访问函数,但是不执行函数结果3.对象拥有数据类型(函数类型),对象可以进行赋值操作4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型5.Scala将对象作为参数,传入到另一个函数中,作为参数使用6.特殊情况函数当作对象使用,下划线可省;  函数以函数对象作为形参,统一下划线可省;7.形参为函数对象的 匿名写法8.Scala也可以将函数对象作为结果返回;*///    1.TODO 函数也是对象    scala中声明了一个函数 等价于声明一个函数对象def fun01()={}println(fun01)    //()    //调用时省略小括号//    2.TODO 将函数当作对象来用,也就是访问函数,但是不执行函数结果println(fun01 _)    //_07函数和对象.Demo01$$$Lambda$5/245672235@4cdbe50fprintln((fun01 _).toString())    //_07函数和对象.Demo01$$$Lambda$6/2114694065@6debcae2//    3.将函数对象赋值给变量    如何查看f的类型/*** 函数类型Function0[Unit]      0表示函数参数列表的个数* 中括号中 表示函数没有返回值;** 如果有一个参数有返回值的 函数类型    -->* def fun02(age:Integer):String={"zhangsan"}* var f1:Function1[Integer,String] = fun02 _     //Integer表示函数形参的类型,String表示函数返回值类型* 函数对象的参数最多支持22个 , 函数的参数的个数是无限个;   //谁没事会写这么多?*/var f:Function0[Unit] = fun01 _println()def fun02(age:Integer):String={"zhangsan"}var f1:Function1[Integer,String] = fun02 _var f2:Function1[Integer,String] = fun02    //下划线可省f2 = fun02    //下划线可省//    4.函数对象类型赋值的简单写法   函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型def fun03(name:String,age:Integer):Unit={println("xxx")}val f3:(String,Integer)=>Unit = fun03 _     //形参列表仅一个参数则,小括号可省//    且函数对象 可以直接执行f3("zhangsan",18)     //xxxf3      //这写法啥也不是没用   .函数可以省略(),但是对象不能省略()//    5.Scala将对象作为参数,传入到另一个函数中,作为参数使用;
//    案例:将test函数中传入User对象def sum(x:Int,y:Int):Int={x+y}def diff(x:Int,y:Int):Int={x-y}def test(f: (Int,Int)=>Int):Unit={val result = f(10, 20)println(result)}//基本调用println(sum(20, 30))    //50test(sum)     //30      //将函数对象作为参数使用,将我们的逻辑进行传递,但是逻辑不用写死;test(diff)    //-10      //使用什么逻辑作者来顶,内部执行即可;//    6.特殊情况函数当作对象使用,下划线可省/*** 使用下划线的目的就是使函数不执行,而是当作对象使用,如果明确知道函数不执行,使用下划线即可;** 小结:只要明确形参是函数对象,下划线都可去**///    7.形参为函数对象的 匿名写法如下test((x:Int,y:Int)=>{x+y})//匿名写法也就是调用函数的时候直接定义函数对象;仅保留形参列表 和 函数体,中间使用=>连接//    7.1同 函数的定义,函数的方法若仅有一行,那么花括号可以省略test((x:Int,y:Int)=> x+y)
//    7.2函数的参数类型由于和 test形参一致,所以参数类型可省     //关于小括号都别省test((x,y)=> x+y)//    7.3如果参数按照顺序只执行一次,那么可以使用下划线代替参数,省略参数列表   ;但是不能嵌套使用test(_ + _)test(_ - _)   //下划线就表示第一参数,以此类推;//    8.Scala也可以将函数对象作为结果返回;def outer()={def inner(): Unit = {println("inner")}inner _   //作为对象返回必须加下划线}var f11 = outer()f11()//    8.1特殊调用方法outer()()   //看上述代码 outer()其实就是f11 对象,对象加括号就可以执行函数逻辑}}

http://www.ppmy.cn/devtools/27691.html

相关文章

在cocos2d-x中编译/调试curl库

环境参数 系统:mac os x10.6 xocde:4.0.2 ios sdk:4.3 curl:curl-7.22.0 不知道curl是做什么的,就自己google了,这里暂时不纠结这个问题。 因一个cocos2d-x项目需要使用curl库,但是curl官方…

MySQL商城数据表(20-29)

20快递表 DROP TABLE IF EXISTS xuge_express; CREATE TABLE xuge_express (expressId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,expressName varchar(50) NOT NULL COMMENT 快递名称,-dataFlag tinyint(4) NOT NULL DEFAULT 1 COMMENT 有效标记(1 &#x…

【toos】工具篇

1 通用的makefile 编写一个makefile&#xff0c;可以将其所在目录下的所有独立 .c 文件编译生成同名可执行文件。 src $(wildcard *.c) # 拿到所有*.c target $(patsubst %.c, %, $(src)) # 将src中所有%.c替换成%ALL:$(target)%:%.cgcc $< -o …

模型剪枝-Network Slimming算法分析

代码见文末 论文地址&#xff1a;Learning Efficient Convolutional Networks through Network Slimming ICCV 2017 Open Access Repository 1.概述 由于边缘设备的限制&#xff0c;在模型的部署中经常受到模型大小、运行内存、计算量的限制。之前的方法要么只能解决其中一个…

中兴F7607P自启动程序,关闭JAVA插件

中兴F7607P自启动程序&#xff0c;关闭JAVA插件 本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 原文地址 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为C…

Dockerfile 里 ENTRYPOINT 和 CMD 的区别

ENTRYPOINT 和 CMD 的区别&#xff1a; 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令&#xff0c;而 CMD 则提供了默认参数。通过结合使用这两个指令&#xff0c;可以在启动容器时灵活地指定额外的参…

【笔试题汇总】华为春招笔试题题解 2024-4-24

这里是paoxiaomo&#xff0c;一个现役ACMer&#xff0c;之后将会持续更新算法笔记系列以及笔试题题解系列 本文章面向想打ICPC/蓝桥杯/天梯赛等程序设计竞赛&#xff0c;以及各个大厂笔试的选手 感谢大家的订阅➕ 和 喜欢&#x1f497; 有什么想看的算法专题可以私信博主 &…

Centos7 安装Git、使用

Centos7 安装Git 一、安装步骤1.1 查看版本1.2 卸载1.3 安装 二、创建仓库2.1 新增仓库2.2 新增配置项 三、管理文件3.1 文件创建3.2 文件修改、add、commit3.3 tree结构探索 四、分支4.1 创建分支&#xff1a;4.2 查看分支4.3 切换分支4.4 删除分支4.5 合并冲突 一、安装步骤 …