Scala014--Scala中的函数

一,函数的定义和声明

对于其他计算机语言来说,如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:参数类型)=>{函数体}

  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值