09_Scala函数和对象

文章目录

函数和对象

复制代码
scala万物皆对象
scala是完全面向函数式编程语言,万物皆函数

1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象

复制代码
//    1.TODO 函数也是对象    scala中声明了一个函数 等价于声明一个函数对象
    def fun01()={}
    println(fun01)    //()    //调用时省略小括号

2.将函数当作对象来用,也就是访问函数,但是不执行函数结果

复制代码
//    2.TODO 将函数当作对象来用,也就是访问函数,但是不执行函数结果
    println(fun01 _)    //_07函数和对象.Demo01$$$Lambda$5/245672235@4cdbe50f
    println((fun01 _).toString())    //_07函数和对象.Demo01$$$Lambda$6/2114694065@6debcae2

3.对象拥有数据类型(函数类型),对象可以进行赋值操作

  • 函数类型Function0Unit 0表示函数参数列表的个数

  • 中括号中 表示函数没有返回值;

  • 如果有一个参数有返回值的 函数类型 -->

  • def fun02(age:Integer):String={"zhangsan"}

  • var f1:Function1Integer,String = fun02 _ //Integer表示函数形参的类型,String表示函数返回值类型

  • 函数对象的参数最多支持22个 , 函数的参数的个数是无限个; //谁没事会写这么多?

    var f:Function0[Unit] = fun01 _
    println()

    def fun02(age:Integer):String={"zhangsan"}
    var f1:Function1[Integer,String] = fun02 _
    var f2:Function1[Integer,String] = fun02 //下划线可省
    f2 = fun02 //下划线可省

4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型

复制代码
    def fun03(name:String,age:Integer):Unit={
      println("xxx")
    }
    val f3:(String,Integer)=>Unit = fun03 _     //形参列表仅一个参数则,小括号可省

//    且函数对象 可以直接执行
    f3("zhangsan",18)     //xxx
    f3      //这写法啥也不是没用   .函数可以省略(),但是对象不能省略()

5.Scala将对象作为参数,传入到另一个函数中,作为参数使用

复制代码
//    案例:将test函数中传入User对象
    def sum(x:Int,y:Int):Int={
      x+y
    }

    def diff(x:Int,y:Int):Int={
      x-y
    }
    def test(f: (Int,Int)=>Int):Unit={
      val result = f(10, 20)
      println(result)
    }


    //基本调用
    println(sum(20, 30))    //50
    test(sum)     //30      //将函数对象作为参数使用,将我们的逻辑进行传递,但是逻辑不用写死;
    test(diff)    //-10      //使用什么逻辑作者来顶,内部执行即可;

6.特殊情况函数当作对象使用,下划线可省; 函数以函数对象作为形参,统一下划线可省;

  • 使用下划线的目的就是使函数不执行,而是当作对象使用,如果明确知道函数不执行,使用下划线即可;

  • 小结:只要明确形参是函数对象,下划线都可去*

7.形参为函数对象的 匿名写法

复制代码
    test(
      (x:Int,y:Int)=>{
        x+y
      }
    )//匿名写法也就是调用函数的时候直接定义函数对象;仅保留形参列表 和 函数体,中间使用=>连接

//    7.1同 函数的定义,函数的方法若仅有一行,那么花括号可以省略
    test(
      (x:Int,y:Int)=> x+y
    )
//    7.2函数的参数类型由于和 test形参一致,所以参数类型可省     //关于小括号都别省
    test(
      (x,y)=> x+y
    )

//    7.3如果参数按照顺序只执行一次,那么可以使用下划线代替参数,省略参数列表
    test(
       _ + _
    )

    test(_ - _)   //下划线就表示第一参数,以此类推;

特殊情况:下划线不能嵌套使用

上述代码无法区分,下划线是作用println函数还是test函数

8.Scala也可以将函数对象作为结果返回;

复制代码
    def outer()={
      def inner(): Unit = {

        println("inner")

      }
      inner _   //作为对象返回必须加下划线
    }

    var f11 = outer()


    f11()

//    8.1特殊调用方法
    outer()()   //看上述代码 outer()其实就是f11 对象,对象加括号就可以执行函数逻辑

全局代码

scala 复制代码
package _07函数和对象

object Demo01 {
  def main(args: Array[String]): Unit = {
    /**
    scala万物皆对象
    scala是完全面向函数式编程语言,万物接函数

    ->  函数就是对象,对象就是函数

     1.函数也是对象    scala中声明了一个函数 等价于声明一个函数对象

     2.将函数当作对象来用,也就是访问函数,但是不执行函数结果

     3.对象拥有数据类型(函数类型),对象可以进行赋值操作

     4.函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型

     5.Scala将对象作为参数,传入到另一个函数中,作为参数使用

     6.特殊情况函数当作对象使用,下划线可省;  函数以函数对象作为形参,统一下划线可省;

     7.形参为函数对象的 匿名写法

     8.Scala也可以将函数对象作为结果返回;
     */

//    1.TODO 函数也是对象    scala中声明了一个函数 等价于声明一个函数对象
    def fun01()={}
    println(fun01)    //()    //调用时省略小括号

//    2.TODO 将函数当作对象来用,也就是访问函数,但是不执行函数结果
    println(fun01 _)    //_07函数和对象.Demo01$$$Lambda$5/245672235@4cdbe50f
    println((fun01 _).toString())    //_07函数和对象.Demo01$$$Lambda$6/2114694065@6debcae2

//    3.将函数对象赋值给变量    如何查看f的类型
    /**
     * 函数类型Function0[Unit]      0表示函数参数列表的个数
     * 中括号中 表示函数没有返回值;
     *
     * 如果有一个参数有返回值的 函数类型    -->
     * def fun02(age:Integer):String={"zhangsan"}
     * var f1:Function1[Integer,String] = fun02 _     //Integer表示函数形参的类型,String表示函数返回值类型
     * 函数对象的参数最多支持22个 , 函数的参数的个数是无限个;   //谁没事会写这么多?
     */
    var f:Function0[Unit] = fun01 _
    println()

    def fun02(age:Integer):String={"zhangsan"}
    var f1:Function1[Integer,String] = fun02 _
    var f2:Function1[Integer,String] = fun02    //下划线可省
    f2 = fun02    //下划线可省

//    4.函数对象类型赋值的简单写法   函数对象类型的省略写法,也就是将函数定义时的: 变为=> ,其次形参列表仅保留变量类型
    def fun03(name:String,age:Integer):Unit={
      println("xxx")
    }
    val f3:(String,Integer)=>Unit = fun03 _     //形参列表仅一个参数则,小括号可省

//    且函数对象 可以直接执行
    f3("zhangsan",18)     //xxx
    f3      //这写法啥也不是没用   .函数可以省略(),但是对象不能省略()

//    5.Scala将对象作为参数,传入到另一个函数中,作为参数使用;
//    案例:将test函数中传入User对象
    def sum(x:Int,y:Int):Int={
      x+y
    }

    def diff(x:Int,y:Int):Int={
      x-y
    }
    def test(f: (Int,Int)=>Int):Unit={
      val result = f(10, 20)
      println(result)
    }


    //基本调用
    println(sum(20, 30))    //50
    test(sum)     //30      //将函数对象作为参数使用,将我们的逻辑进行传递,但是逻辑不用写死;
    test(diff)    //-10      //使用什么逻辑作者来顶,内部执行即可;

//    6.特殊情况函数当作对象使用,下划线可省
    /**
     * 使用下划线的目的就是使函数不执行,而是当作对象使用,如果明确知道函数不执行,使用下划线即可;
     *
     * 小结:只要明确形参是函数对象,下划线都可去*
     */

//    7.形参为函数对象的 匿名写法如下
    test(
      (x:Int,y:Int)=>{
        x+y
      }
    )//匿名写法也就是调用函数的时候直接定义函数对象;仅保留形参列表 和 函数体,中间使用=>连接

//    7.1同 函数的定义,函数的方法若仅有一行,那么花括号可以省略
    test(
      (x:Int,y:Int)=> x+y
    )
//    7.2函数的参数类型由于和 test形参一致,所以参数类型可省     //关于小括号都别省
    test(
      (x,y)=> x+y
    )

//    7.3如果参数按照顺序只执行一次,那么可以使用下划线代替参数,省略参数列表   ;但是不能嵌套使用
    test(
       _ + _
    )

    test(_ - _)   //下划线就表示第一参数,以此类推;

//    8.Scala也可以将函数对象作为结果返回;
    def outer()={
      def inner(): Unit = {

        println("inner")

      }
      inner _   //作为对象返回必须加下划线
    }

    var f11 = outer()


    f11()

//    8.1特殊调用方法
    outer()()   //看上述代码 outer()其实就是f11 对象,对象加括号就可以执行函数逻辑















































  }

}
相关推荐
code2cat2 小时前
Java进阶篇之AtomicMarkableReference:引用还在,标记已经改变
java·开发语言·cas·并发编程·逻辑删除
CappuccinoRose2 小时前
FormData数据处理
开发语言·前端·javascript·表单数据
Zguigo3 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
-Marks-3 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)3 小时前
C++11并发支持库
开发语言·c++
一技安身3 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言
hudd6684 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
I Am a robert girl4 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
golang学习记4 小时前
rust开发,选VS Code还是RustRover?
开发语言·后端·rust
打工仔折腾 AI5 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战