经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
scala (3) Function 和 Method
来源:cnblogs  作者:超爷天下第一  时间:2018/9/25 20:28:22  对本文有异议

scala 定义函数的关键字是 val  

定义函数的通用格式是  val  函数名 = (参数列表)=> {函数体}

  1. object FunctionDemo {
  2. //通用的定义格式
  3. val f1 = (x: Int, y: Int) => {
  4. x + y
  5. }
  6. //先定义函数的参数列表类型,具体的函数参数在函数体中定义
  7. val f2: (Int, Int, Int) => Int = {
  8. (x, y, z) => {
  9. x + y + z
  10. }
  11. }
  12. def main(args: Array[String]): Unit = {
  13. val v1 = f1(1, 2)
  14. println(v1)
  15. val v2 = f2(1, 2, 4)
  16. println(v2)
  17. }
  18. }

在scala 中定义方法的关键字是 : def 

定义方法的通用格式: def  方法名(参数列表) : 方法的返回值类型 = {方法体}

//方法的返回值不需要使用return关键字,同时方法的最后一条语句的返回值作为整个方法的返回值
//[注意]:如果一个方法有返回值,那么方法的最后一条语句的返回值,一定要和方法的返回值类型保存一致
def m1(x: Int, y: Int): Int = {
  var a = 1
  a += 2
  x + y
}

  1. //可以省略掉方法的返回值类型,scala会自动根据最后一条语句的返回值推断出方法的返回值类型
  2. def m2(x: Int, y: Int) = {
  3. x + y
  4. }
  1. //如果方法没有返回值,可以使用Unit来标注,变现为“()”,类似于java中的void
  2. def m3(x: Int, y: Int): Unit = {
  3. x + y
  4. }
  1. //也是没有返回值的方法,在参数列表括号后面直接添加方法体{},我们称这种方法为过程
  2. def m3_3(x: Int, y: Int) {
  3. println(x + y)
  4. }
  1. //先定义方法参数列表类型,具体的参数名称在方法体中
  2. def m4: (Int, Int, Int) => Int = {
  3. (x, y, z) => {
  4. x + y + z
  5. }
  6. }
  1. //柯理化
  2. def m5(x: Int)(y: Int) = {
  3. x + y
  4. }
  5. //柯理化
  6. def m6(x: Int) = (y: Int) => {
  7. x + y
  8. }
  1. //如果定义一个方法,方法名称后面的参数列表为空,那么在调用的时候可以加括号,也可以不叫括号
  2. def m7() = {
  3. println("hello world")
  4. }
  5. //如果定义一个方法,方法没有参数列表,那么在调用的时候也不能加“()”,否则编译不通过
  6. def m8 = {
  7. println("hello world")
  8. }
  1. //递归方法要求我们必须写明方法的返回值类型,不能省略掉否则报错
  2. def m9(num: Int): Int = {
  3. if (num <= 0) 0 else m9(num - 1)
  4. }
  5. //当参数个数不固定时,那么这时候可以将参数定义为可变参数,可变参数要求是方法的最后一个参数
  6. def m10(name: String, nums: Int*): Unit = {
  7. var sum = 0
  8. for (num <- nums) {
  9. sum += num
  10. }
  11. println(name + "=" + sum)
  12. }
  1. //在Scala中,有时我们调用某些方法时,不希望给出参数的具体值,而希望使用参数自身默认的值,
  2. // 此时就定义方法时使用默认参数
  3. //在调用方法的时候,赋值是从左往右依次赋值,所以说需要把没有默认值的放在最前面
  4. def m11(age: Int, name: String = "旺财", sex: String = "男") = {
  5. println(name + "=" + age + "=" + sex)
  6. }
  1. def main(args: Array[String]): Unit = {
  2. /* val sum = m1(1, 2)
  3. println(sum)
  4. */
  5. /* val sum = m2(1, 3)
  6. println(sum)*/
  7.  
  8. // println(m3(1, 2))
  9. //println(m5(2)(3))
  10. // println(m6(3)(4))
  11. //m7
  12. // m8
  13. // m3_3(1, 3)
  14. // println(m9(9))
  15. // m10("旺财", 1, 2, 3, 4, 5)
  16. // m11(12)
  17. //带参数名调用,传入参数就可以无序
  18. m11(sex = "公", age = 12,name = "zs")
  19. }
  20. }

在scala中方法可以转换成函数,有两种转换方法

第一种:下划线  :方法名

第二种:scala会隐式的去转换,不需要手动实现

  1. object MethodToFunctionDemo {
  2. def m1(x: Int, y: Int) = {
  3. x + y
  4. }
  5. /**
  6. * 接收三个参数
  7. *
  8. * @param f 它是一个函数,接收两个参数,返回值是Int类型,在传入这个参数的时,传入进来的参数必须符合函数的签名
  9. * @param y 普通参数
  10. * @param x 普通参数
  11. * @return
  12. */
  13. def m2(f: (Int, Int) => Int, y: Int, x: Int) = {
  14. f(x, y)
  15. }
  16. def main(args: Array[String]): Unit = {
  17. //通过下划线将方法转换成函数
  18. // val f1 = m1 _
  19. // println(f1)
  20. //scala会自动进行转换
  21. //val v2 = m2(m1, 1, 2)
  22. // println(v2)
  23. val arr = Array(1, 2, 3, 4, 5)
  24. val foreachFunchion = (x: Int) => {
  25. println(x)
  26. }
  27. // arr.foreach(foreachFunchion)
  28. //arr.foreach((x: Int) => {println(x) })
  29. //arr.foreach((x: Int) => println(x))
  30. // arr.foreach((x) => println(x))
  31. // arr.foreach(println(_))
  32. val filterFunction = (x: Int) => {
  33. x > 3
  34. }
  35. arr.filter(filterFunction).foreach((x:Int)=>println(x))
  36. }
  37. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号