大数据全系列 教程
1869个小节阅读:467.9k
目录
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
package cn.itbaizhan.chapter03
//函数作为值,函数也是个对象
object FunctionToTypeValue {
def main(args: Array[String]): Unit = {
//Student stu = new Student()
/*val a = ()=>{"GTJin"}
//输出对象的地址
//cn.itbaizhan.chapter03.FunctionToTypeValue$$$Lambda$1/495053715@3f0ee7cb
println(a)*/
//完整写法
def funcA():String={
println("funcA被执行了。。。")
"GTJin"
}
/*println("--------before val x = funcA()----------")
//执行下一行代码,输出:funcA被执行了。。。 表示将函数funcA的结果赋值给了x,并不是将funcA作为对象赋值给x
val x = funcA()
println(x)
println("--------after val x = funcA()----------")*/
//如果想将funcA函数作为对象赋值给x,那么该如何实现?
//使用 "函数名 + 空格 + _",将函数作为对象赋值给x,在赋值的过程中不会函数体中的代码
val x = funcA _
//写下 x 后提示框显示"x ()=>String",表示x是一个无参返回值类型为String的函数
//万物皆对象,是对象就应该有对应的类型,所以函数也有对象的类型
//Function0[String] Function0表示0个参数的函数对象 [String]表示函数的返回值类型为String
//Function1[-T1,+R] 表示1个参数的函数对象 []里面最后的+R表示返回值类型为,-T1参数类型
//Function2[-T1,-T2,+R] 表示2个参数的函数对象 []里面最后的+R表示返回值类型,-T1第一参数类型 -T2第二个参数类型
//... Function22 将函数作为对象赋值时,参数声明的个数最多22个,对应Function22
//函数独立定义和使用时,声明参数的个数时没有限制的。、
//22在Scala语言中是一个神奇的数字,官方没有明确说明,后续还会在其它地方见到Tuple22
val f1:Function0[String] = funcA _
println(x==f1)//false 相当于创建了两个函数对象
def funcB(name:String):String={
"funcB....name="+name
}
//函数类型还有另外一种表示方式:(参数类型)=>返回值类型 ,多个参数之间使用逗号隔开
//val f2:Function1[String,String] = funcB _
val f2:(String)=>String = funcB _
//如果函数只有一个参数小括号可以省略
val f2_1:String=>String = funcB _
def funcC(name:String,age:Int): String ={
s"name=${name},age=${age}"
}
//两个或两个以上参数时,小括号不能省略
val f3:(String,Int)=>String = funcC _
//val f3_1:String,Int=>String = funcC _ //错误的
/**val x = funcA _为什么在函数名后 使用下滑线让函数作为对象使用,因为代码中没有明确的变量
* 类型,所以需要通过取值类型进行推断。
* 如果变量声明时的类型为函数类型,那么可以不适用下划线让函数作为对象
*
*/
val f4:(String)=>String = funcB
val f5:(String,Int)=>String = funcC
}
}