Scala方法和函数

打印 上一主题 下一主题

主题 916|帖子 916|积分 2748


  • 方法和函数的作用几乎是一样的,但是函数在使用的过程中更加灵活和多样化
  • scala中函数是头等公民 . 可以作为方法的返回值和参数使用
  • scala是一个集面向对象和面向函数于一身的编程语言 , 灵活的函数是函数式编程的一种体现
  • 函数的使用使代码更加简洁和灵活
函数

scala中一种函数式编程语言 ,函数是scala中的头等公民,建议优先使用函数 , 函数实现的功能和方法一样 ,但是我们可以把函数理解成一种特殊的业务逻辑对象 ,所以函数可以作为参数和返回值.... 函数也是用来处理数据的代码封装
函数的定义

方式一:
  1. val / var 函数名称=(函数的参数列表) => 函数体
复制代码
举例:
  1. val add = (x: Int, y: Int) => {
  2.   x + y
  3. }
  4. val parseStr = (str: String) => {
  5.   str.toUpperCase()
  6. }
  7. //  函数体中的内容只有一行代码可以省略大括号
  8. var product = (x:Double) => x*x
复制代码
方式二:
  1. val / var 函数名称:(输入参数类型)=> 返回值类型 = (参数的引用)=> 函数体
  2. val add2:(Int,Int)=>Int=(x,y)=>{
  3.   x+y
  4. }
  5. add2 函数名
  6. (Int ,Int) 要处理的参数类型列表
  7. =>Int  函数处理完数据的返回值类型
  8. =(x,y) 传入实际参数的接收变量名
  9. {x+y}  函数体 运算求和
  10. 注意: 代码块的最后一行是函数的返回值 ,需要和=>(Int)类型保持一致
复制代码
分类


  • 函数 1:无参,无返回值
  • 函数 2:无参,有返回值
  • 函数 3:有参,无返回值
  • 函数 4:有参,有返回值
  • 函数 5:多参,无返回值
  • 函数 6:多参,有返回值
  1. def main(args: Array[String]): Unit = {
  2. // 函数 1:无参,无返回值
  3. val test1 ={
  4. println("无参,无返回值")
  5. }
  6. test1()
  7. // 函数 2:无参,有返回值
  8. val test2={
  9. "无参,有返回值"
  10. }
  11. println(test2())
  12. // 函数 3:有参,无返回值
  13. val test3 =(s:String)=>{
  14. println(s)
  15. }
  16. test3("jinlian")
  17. // 函数 4:有参,有返回值
  18. val test4 = (s:String)=>{
  19. return s+"有参,有返回值"
  20. }
  21. println(test4("hello "))
  22. // 函数 5:多参,无返回值
  23. val test5 = (name:String, age:Int)=>{
  24. println(s"$name, $age")
  25. }
  26. test5("dalang",40)
  27.   // 函数 6:多参,有返回值
  28.   val test6 = (name:String, age:Int)=>{
  29.       "名字是:" + name  + ",年龄是:" + age
  30. }
  31. }
复制代码
函数的本质

函数的本质其实就是java中写了 一个接口,然后函数体就是这个接口的具体实现
代码示例:
  1. //写一个接口
  2. package com.doit;
  3. public interface Function2<T,U> {
  4.     public U apply(T t,T t1);
  5. }
  6. // 接口的实现类
  7. Function2<Integer, Integer> func = new Function2<Integer, Integer>() {
  8.     @Override
  9.     public Integer apply(Integer integer, Integer t1) {
  10.         return integer + t1;
  11.     }
  12. };
复制代码
练一练:

需求1:定义一个函数,传入一个值,如果这个值是三位数,则判断是不是水仙花数,返回布尔类型的值,如果这个值不是一个三位数,就返回一个字符串"输入的数字不合法,需要的数字范围是100-999"
  1. package com.doit.day01.day02
  2. import scala.math.pow
  3. /**
  4. * 定义一个函数,传入一个值,如果这个值是三位数,
  5. * 则判断是不是水仙花数,返回布尔类型的值,如果这个值不是一个三位数,
  6. * 就返回一个字符串"输入的数字不合法,需要的数字范围是100-999"
  7. */
  8. object Demo_Test {
  9.   def main(args: Array[String]): Unit = {
  10.     val value = flower(123)
  11.     println(value)
  12.   }
  13.   val flower = (num: Int) => {
  14.     if (num < 100 || num > 999) {
  15.       "输入的数字不合法,需要的数字范围是100-999"
  16.     } else {
  17.       val unit = num % 10
  18.       val tens = num / 10 % 10
  19.       val hundreds = num / 100 % 10
  20.       val res = (pow(unit, 3) + pow(tens, 3) + pow(hundreds, 3)).toInt
  21.       if (res == num) {
  22.         true
  23.       } else {
  24.         false
  25.       }
  26.     }
  27.   }
  28. }
复制代码
需求二:将上面的函数,用java的接口也写一遍,了解下函数的本质
  1. //接口
  2. package com.doit;
  3. public interface Function1<U,T> {
  4.     T apply(U u);
  5. }
  6. //实现
  7. package com.doit;
  8. import static java.lang.Math.pow;
  9. public class Demo {
  10.     public static void main(String[] args) {
  11.         //实现接口
  12.         Function1<Integer, Object> res = new Function1<Integer, Object>() {
  13.             @Override
  14.             public Object apply(Integer num) {
  15.                 if (num < 100 || num > 999) {
  16.                     return "输入的数字不合法,需要的数字范围是100-999";
  17.                 } else {
  18.                     int unit = num % 10;
  19.                     int tens = num / 10 % 10;
  20.                     int hundreds = num / 100 % 10;
  21.                     int res = (int) (pow(unit, 3) + pow(tens, 3) + pow(hundreds, 3));
  22.                     if (res == num) {
  23.                         return true;
  24.                     } else {
  25.                         return false;
  26.                     }
  27.                 }
  28.             }
  29.         };
  30.         //调用apply方法传入参数获取到最终结果
  31.         Object apply = res.apply(1);
  32.         System.out.println(apply);
  33.     }
  34. }
复制代码
需求3:定义一个函数,功能是获取mysql的连接
  1. //定义一个函数,功能是获取mysql的连接
  2. val getMysqlConn = (url:String,user:String,passWord:String)=>{
  3.   classOf[com.mysql.jdbc.Driver]
  4.   val connetcion = DriverManager.getConnection(url,user,passWord)
  5.   connetcion
  6. }
  7. val conn: Connection = getMysqlConn("jdbc:mysql://localhost:3306/test01", "root", "123456")
  8. val pps: PreparedStatement = conn.prepareStatement("select * from resume_info")
  9. val res: ResultSet = pps.executeQuery()
  10. while (res.next()){
  11.   val id: Int = res.getInt(1)
  12.   val jobName: String = res.getString(2)
  13.   val date: String = res.getString(3)
  14.   val num: Int = res.getInt(4)
  15.   println(s"$id , $jobName ,$date ,$num")
  16. }
复制代码
方法

方法是逻辑片段的封装 ,可以处理一个或者多个数据 , 可以有返回值也可以没有没有返回值 ,提高了代码的复用性
方法的定义
  1. def functionName ([参数列表]) : [return type] = {
  2.    function body
  3.    return [expr]
  4. }
复制代码
没有等号和方法体的方法称为抽象方法,抽象方法定义在抽象类和特质中
代码示例:
  1. // 定义一个方法 有两个参数  有返回值
  2. def add(x:Int , y:Int):Int={
  3.   val sum = x + y
  4.   sum
  5.   // return 可以省略 , 代码块的最后一行就是这个方法的返回值
  6. //  return sum
  7. }
  8. /**
  9.   * 定义一个没有参数没有返回值的方法  Unit关键字代表没有返回值 类似于java中的void
  10.   */
  11. def show()={
  12.   println("show......")
  13. }
  14. /**
  15.   * 如果方法没有参数  方法后面的() 可以省略  ,注意在调用的时候也不要书写小括号
  16.   */
  17. def show2={
  18.   println("show......")
  19. }
  20. // 在抽象类或者特质中定义抽象方法
  21. def m1
复制代码
方法的调用

方法的调用和java中的调用方式不太一样,如果方法定义在object中 在本类直接方法名调用  在其他类中调用 object 对象名调用,如果方法定义在普通的class 类中 , 本类之间直接调用! 其他类中new 类 .方法调用
方法总结

注意方法的参数和返回值可以是函数 ,这样的方法称为高阶函数 ,高阶函数中详细讲解

  • 定义方法的关键字,def
  • 方法的返回值,最后一行的内容,如果是循环,打印,那么返回值是 Unit
  • 如果空参方法,定义的时候有(),调用的时候可以省略(),但是如果定义的时候没有(),调用方法的时候,不能加()
  • 方法的返回值类型,可以省略,但是特殊情况下,必须加上:
    ○        方法有 return 关键字
    ○        递归调用的方法。
代码示例:
  1. val  f = (x:String)=>{x}
  2. f
  3. def show(x:String) :Unit ={
  4. x
  5. }
  6. show
复制代码
练一练:

需求一:定义一个方法,传入一个1-9中任意的整数,如果这个整数是在1-9内,那么就打印九九乘法表中到第几行,如果传进去的不是一个1-9的数,打印:干啥呢,不好好听课,要传1-9的整数
[code]package com.doit.day01.day02import scala.math.pow/** * 需求一:定义一个方法,传入一个1-9中任意的整数, * 如果这个整数是在1-9内,那么就打印九九乘法表中到第几行, * 如果传进去的不是一个1-9的数,打印:干啥呢,不好好听课,要传1-9的整数 */object Demo_Test {  def main(args: Array[String]): Unit = {    multiplyTable(11)  }  def multiplyTable(num:Int)={    if(num9){      println("干啥呢,不好好听课,要传1-9的整数")    }else {      for(i
•        方法不能作为最终的表达式存在,但是函数可以,返回函数的签名信息
•        方法和函数调用的时候都需要显示的传入参数
•        函数可以作为方法的参数,和返回值类型。</p>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表