文章目录
- 函数和对象
- 1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象
- 2.将函数当作对象来用,也就是访问函数,但是不执行函数结果
- 3.对象拥有数据类型(函数类型),对象可以进行赋值操作
- 4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型
- 5.Scala将对象作为参数,传入到另一个函数中,作为参数使用
- 6.特殊情况函数当作对象使用,下划线可省; 函数以函数对象作为形参,统一下划线可省;
- 7.形参为函数对象的 匿名写法
- 8.Scala也可以将函数对象作为结果返回;
函数和对象
scala万物皆对象
scala是完全面向函数式编程语言,万物皆函数
1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象
// 1.TODO 函数也是对象 scala中声明了一个函数 等价于声明一个函数对象
def fun01()={}
println(fun01) //() //调用时省略小括号
2.将函数当作对象来用,也就是访问函数,但是不执行函数结果
// 2.TODO 将函数当作对象来用,也就是访问函数,但是不执行函数结果
println(fun01 _) //_07函数和对象.Demo01$$$Lambda$5/245672235@4cdbe50f
println((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) //xxx
f3 //这写法啥也不是没用 .函数可以省略(),但是对象不能省略()
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)) //50
test(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 对象,对象加括号就可以执行函数逻辑
全局代码
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@4cdbe50f
println((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) //xxx
f3 //这写法啥也不是没用 .函数可以省略(),但是对象不能省略()
// 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)) //50
test(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 对象,对象加括号就可以执行函数逻辑
}
}