一,函数的定义和声明
对于其他计算机语言来说,如Java,python,函数和方法是一样的,但是对于Scala来说,函数和方法并不是同一个概念,方法是类或者是对象的成员,而函数是一个对象。但是函数也像方法那样,可以简写一些地方,如:函数的类型,返回值类型,如果函数体里面一条语句的话,可以省略花括号。如果还是初学的话,建议写全。
函数的定义格式:
val 变量名:【函数类型】(参数类型1,参数类型2)=> 返回值类型=(参数名1:参数类型1,参数名2:参数类型2)=>{函数体}
scala> val func:(Int,Int)=>Int=(a:Int,b:Int)=>{a+b} // 定义一个func函数
func: (Int, Int) => Int = $Lambda$1041/2131366717@644a3add
1,定义函数和定义方法的区别
函数的声明和方法的声明是不一样的,接下来我先回顾一下Scala中方法的定义和声明,并将其和函数进行对比:
方法的定义和声明:
1,def关键字
2,方法名和参数列表可以直接放到一起
3,返回值类型的前面是冒号:
4,=方法指向方法体
def func1(arg1:type,arg2:type):return_type={方法体}函数的定义和声明;
1,val 定义一个变量(常量)接收函数的值,变量名就是函数名
2,参数列表和函数名之间使用冒号:分开(并且只需要指定需要的元素的类型即可,不需要参数名)
3,返回值的前面使用指向=>
4,返回值后面不是直接跟函数体,而是函数的参数列表(需要传入参数名:参数类型)
5,函数体和函数的参数列表之间使用=>分开。
val variable1:(type,type)=>return_type=(arg1:type,arg2:type)=>{方法体}
现在我定义一个函数func和meth方法,并在没有任何参数情况下直接返回它们的结果:
scala> val func:(Int,Int)=>Int=(a:Int,b:Int)=>{a+b} // 定义一个func函数
func: (Int, Int) => Int = $Lambda$1041/2131366717@644a3add
scala> def meth(a:Int,b:Int):Int={a-b} // 定义一个meth方法
meth: (a: Int, b: Int)Int
scala> func // 没有使用任何参数
res0: (Int, Int) => Int = $Lambda$1041/2131366717@644a3add
scala> meth // 没有使用任何参数
<console>:13: error: missing argument list for method meth
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `meth _` or `meth(_,_)` instead of `meth`.
meth // 没有使用任何参数的方法就会报错
如上,我们可以看到,对于函数来说,在没有任何参数情况下,它依旧可以输出,输出的结果为函数的地址。但是对于方法来说,就不行,没有任何参数的方法会直接报错。
二,匿名函数
匿名函数就是没有函数名的函数。格式:(变量名1:变量类型,变量名2:变量类型)=>{函数体}
在集合的应用中比较常用,因为有些时候我们使用一个函数的时候并不需要知道它的函数名,只要该函数计算出来的结果即可。
现在我有一个数据: Array(List(("a",11),("b",2),("b",3)) )
想要输出OUT结果为: Map(a->(1,11),b->(2,5))
1,2分表表示a,b出现的次数;
11,5分别表示a,b对应数字的和。
接下来我就可以如下编写,并得到如下结果:
/**
* @author:码到成龚
* my motoo:"听闻少年二字,应与平庸相斥。"
* 个人代码规范:
* 1,原始数据的变量命名:①只使用单个单词即数据的类型:无嵌套的数据结构②被嵌套的数据结构类型_嵌套的数据结构类型:嵌套的数据结构
* 2,接收结果的变量命名:①包含的数据类型1_包含的数据类型2_返回的变量类型_表达式中使用到的函数1_表达式中使用到的函数2
* 3,调用函数时的注释:①数据调用第一个函数输出的结果为:函数名-OUT;函数名-OUT....以此类推
*
*/
object Func1 {
def main(args: Array[String]): Unit = {
val list_arr=Array(List(("a",11),("b",2),("b",3)) )// 数组中嵌套列表
/*
输出OUT:Map(a->(1,11),b->(2,5)) 字母对应的数字相加,并返回map集合序列
· */
println(list_arr.flatten.toList.groupBy(
/*打印出来的数组为对象地址,需要转成list或者是可变数组才能够看到里面的数据元素:toList
先将同一个字母分组到一起,之后得到字典集合序列:groupBy
*/
f=>f._1 // 匿名函数,表示元组中的第一个元素
).mapValues(
list=>(list.size,list.map(
f=>f._2 // 匿名函数
).sum)
/*
使用mapValues对字典map集合序列的数据进行处理,返回元组类型:mapvalues
元组中的第一个元素为嵌套在数组中对应的每一个列表的长度:size
元组中的第二个元素为字母对应的数字和:sum
*/
))
// 匿名函数:(变量名1:变量类型,变量名2:变量类型)=>{函数体}
// 函数:val 函数名:(参数类型1,参数类型2)=>函数返回值类型=(参数名1:参数类型,参数名2:参数类型)=>{函数体}
}
}