美文网首页
Scala-方法和函数

Scala-方法和函数

作者: 数据萌新 | 来源:发表于2018-10-10 16:50 被阅读0次

    1、方法的定义

    //def用来表示定义一个方法,m1表示方法名,(x:Int,y:Int)是参数列表(参数名:参数类型...),Int = x + y中Int表示返回值类型,x + y则是方法体(当然也可以跟java一样使用{}包起来)
    scala> def m1(x : Int, y : Int) : Int = x + y
    m1: (x: Int, y: Int)Int
    //调用函数
    scala> val res = m1 (3,4)
    res: Int = 7
    

    函数值的返回类型也可以不用指定,会自动判断

    //可以看到能自动判断返回值类型是Int,但是“=”还是要的
    scala> def m1 (x : Int,y : Int) = x * y
    m1: (x: Int, y: Int)Int
    
    scala> val res1 = m1(3,4)
    res1: Int = 12
    

    定义无返回值类型的方法
    如果方法体有多行语句,使用{}括起来

    scala> def m1 (x : Int,y : Int) {
         | print(x+y)
         | }
    m1: (x: Int, y: Int)Unit
    
    scala> m1(5,6)
    11
    或者
    scala> def m1 (x : Int,y : Int) :Unit = {
         | println(x * y)
         | }
    m1: (x: Int, y: Int)Unit
    
    scala> val res = m1(3,7)
    21
    

    上面都是返回单一值,也可以返回对偶元祖或者多个值

    scala> def m1 (x : Int, y : Double) = (y,x)
    m1: (x: Int, y: Double)(Double, Int)
    
    scala> val res = m1(3,4.4)
    res: (Double, Int) = (4.4,3)
    

    2、函数的定义

    //定义了匿名函数,没有"val 变量名="
    scala> (x : Int, y : Int) =>  x * y
    //res2表示变量名,使用它来调用函数,(Int,Int)则表示两个参数都是Int类型 Int = <function2>表示返回一个Int类型的值,函数体使用了两个参数
    res2: (Int, Int) => Int = <function2>
    
    scala> res2(3,4)
    res3: Int = 12
    
    //将匿名函数赋给变量f1(其实是不可变量value,但是还是称变量)
    scala> val f1 = (x : Int, y : Int) =>  x + y
    f1: (Int, Int) => Int = <function2>
    
    scala> val res = f1(5,5)
    res: Int = 10
    
    scala> val f2 = (x: Int) => x * 10
    f2: Int => Int = <function1>
    
    scala> val res = f2 (7)
    res: Int = 70
    

    函数定义的另一种方式

    //x表示传入的Int值,结果是x转String相当于val func = (x:Int) => x.toString
    scala> val func: Int => String = {x => x.toString}
    func: Int => String = <function1>
    
    scala> val func2 = (x : Int) => x.toString
    func2: Int => String = <function1>
    
    scala> func(3)
    res14: String = 3
    
    scala> func2(3)
    res15: String = 3
    ==============
    scala> val func3 : (Int,Int) => Int = {(x,y) => x + y}
    func3: (Int, Int) => Int = <function2>
    
    scala> val func4 = (x :Int, y : Int) => x + y
    func4: (Int, Int) => Int = <function2>
    

    3、方法和函数的区别
    在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
    案例:首先定义一个方法,再定义一个函数,然后将函数传递到方法里面

    //定义m1方法,f : (Int, Int) => Int表示参数是个函数,该函数的参数列表有2个Int类型的形参,返回值是一个Int类型。该方法体中调用这个函数,所以返回类型自动判断也就是函数的返回类型。
    scala> def m1 (f : (Int, Int) => Int) = {
         | f(4,7)
         | }
    m1: (f: (Int, Int) => Int)Int
    
    //定义要传入方法的函数
    scala> val func = (x : Int, y : Int) => x * y
    func: (Int, Int) => Int = <function2>
    
    调用方法,传入函数
    scala> val res = m1(func)
    res: Int = 28
    
    scala> val ran = 1.to(10)
    ran: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    
    scala> val f1 = (x : Int) => x * 2
    f1: Int => Int = <function1>
    
    scala> val result = ran.map(f1)
    result: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
    
    scala> val f2 = (x : Int) => x+10
    f2: Int => Int = <function1>
    
    scala> var result2 = ran.map(f2)
    result2: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    //直接传个匿名函数(x:Int) => x * 5
    scala> ran.map((x:Int) => x * 5)
    res9: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
    
    //更简单的方式x => x * 5,x表示ran中的元素,x * 5表示对ran中的元素进行的操作,结果放入的新的集合中去。
    scala> ran.map(x => x * 5)
    res10: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
    
    //最简单的方式“_”表示ran中的元素
    scala> ran.map(_ * 5)
    res11: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
    

    4、将方法转换为函数
    使用神奇的下划线”_”

    scala> def m1 (x: Int, y :Int) = x + y
    m1: (x: Int, y: Int)Int
    //使用 函数名 空格_将m1这个方法转换成了函数
    scala> val func1 = m1 _
    func1: (Int, Int) => Int = <function2>
    
    //调用由方法转换成的函数
    scala> val result = func1(3,4)
    result: Int = 7
    
    //原来的方法并不改变
    scala> m1(3,4)
    res7: Int = 7
    

    scala> val arr = Array (1,2,3,4,5)
    arr: Array[Int] = Array(1, 2, 3, 4, 5)
    
    scala> var a1 = arr(1)
    a1: Int = 2
    
    scala> arr(1) = 100
    
    scala> arr
    res13: Array[Int] = Array(1, 100, 3, 4, 5)
    

    注:val定义的不能修改指的是变量的引用不能改,但是数组内容可以修改。

    相关文章

      网友评论

          本文标题:Scala-方法和函数

          本文链接:https://www.haomeiwen.com/subject/tlqmaftx.html