【Scala篇】--Scala中的函数

一、前述

Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。

二、具体函数

1、Scala函数的定义

def fun (a: Int , b: Int ) : Unit = {
   println(a+b)
 }
fun(1,1)
    
def fun1 (a : Int , b : Int)= a+b
    println(fun1(1,2))  

注意点:

函数定义语法 用def来定义

l可以定义传入的参数,要指定传入参数的类型

方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候。

 scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回值。

如果返回值可以一行搞定,可以将{}省略不写

传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。

如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。

2、递归函数

  /**
     * 递归函数 
     * 5的阶乘
     */
    def fun2(num :Int) :Int= {
      if(num ==1)
        num
      else 
        num * fun2(num-1)
    }
    print(fun2(5))

 3、包含参数默认值的函数

      默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。

      如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。

**
     * 包含默认参数值的函数
     * 注意:
     * 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值
     * 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称
     */
    def fun3(a :Int = 10,b:Int) = {
      println(a+b)
    }
    fun3(b=2)

 4、可变参数个数的函数

多个参数用逗号分开

   /**
     * 可变参数个数的函数
     * 注意:多个参数逗号分开
     */
    def fun4(elements :Int*)={
      var sum = 0;
      for(elem <- elements){
        sum += elem
      }
      sum
    }
    println(fun4(1,2,3,4))

5、匿名函数

有参匿名函数

无参匿名函数

有返回值的匿名函数

可以将匿名函数返回给val定义的值

匿名函数不能显式声明函数的返回类型

/**
     * 匿名函数
     * 1.有参数匿名函数
     * 2.无参数匿名函数
     * 3.有返回值的匿名函数
     * 注意:
     * 可以将匿名函数返回给定义的一个变量
     */
    //有参数匿名函数
    val value1 = (a : Int) => {
      println(a)
    }
    value1(1)
    //无参数匿名函数
    val value2 = ()=>{
      println("我爱。。。")
    }
    value2()
    //有返回值的匿名函数
    val value3 = (a:Int,b:Int) =>{
      a+b
    }
    println(value3(4,4)) 

6、嵌套函数

/**
     * 嵌套函数
     * 例如:嵌套函数求5的阶乘
     */
    def fun5(num:Int)={
      def fun6(a:Int,b:Int):Int={
        if(a == 1){
          b
        }else{
          fun6(a-1,a*b)
        }
      }
      fun6(num,1)
    }
    println(fun5(5))

 7、偏应用函数

偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。

    /**
     * 偏应用函数
     */
    def log(date :Date, s :String)= {
      println("date is "+ date +",log is "+ s)
    }
    
    val date = new Date()
    log(date ,"log1")
    log(date ,"log2")
    log(date ,"log3")
    
    //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
    val logWithDate = log(date,_:String)
    logWithDate("log11")
    logWithDate("log22")
    logWithDate("log33")

 8、高阶函数

函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。

函数的参数是函数

函数的返回是函数

函数的参数和函数的返回是函数

/**
     * 高阶函数
     * 函数的参数是函数		或者函数的返回是函数		或者函数的参数和返回都是函数
     */
    
    //函数的参数是函数
    def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {
      f(a,100)
    }
    def f(v1 :Int,v2: Int):Int  = {
      v1+v2
    }
    
    println(hightFun(f, 1))
    
    //函数的返回是函数
    //1,2,3,4相加
    def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {
      def f2 (v1: Int,v2:Int) :Int = {
        v1+v2+a+b
      }
      f2
    }
    println(hightFun2(1,2)(3,4))
    
    //函数的参数是函数,函数的返回是函数  因为函数的返回是函数,所以可以理解为调用hightFunc2(1,2)的返回是函数,所以需要在传进去一个参数。
    def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {
      f
    } 
    println(hightFun3(f)(100,200))
    println(hightFun3((a,b) =>{a+b})(200,200))
    //以上这句话还可以写成这样
    //如果函数的参数在方法体中只使用了一次 那么可以写成_表示
    println(hightFun3(_+_)(200,200))

9、柯里化函数

可以理解为高阶函数的简化

  /**
     * 柯里化函数
     */
    def fun7(a :Int,b:Int)(c:Int,d:Int) = {
      a+b+c+d
    }
    println(fun7(1,2)(3,4))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏爱撒谎的男孩

插入排序算法

22750
来自专栏osc同步分享-java技术分享站

java的静态属性,静态块,构造函数的执行顺序

今天为了搞清楚实例化一个对象时其属性等的实例化顺序,写了下面的例子来探究: 实例化一个C的对象,其中,A为其静态属性,B为其普通属性;D为C的父类,E为D的静态...

35160
来自专栏流媒体

C++类大小和静态成员/方法

10550
来自专栏我的博客

Python字符串

# -*- coding: utf-8 -*- import re #字符串替换 str1 = 'hello world world world abc=12...

32860
来自专栏吾爱乐享

java之学习int和String的相互转换

10610
来自专栏Puppeteer学习

OOP in Javascript

13550
来自专栏黑泽君的专栏

Java继承中的几道面试题

13820
来自专栏PHP在线

PHP字符串和数组操作函数

str_split() 函数把字符串分割到数组中。 stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。 stripcslas...

43470
来自专栏一“技”之长

深入理解JavaScript函数 原

    从功能上理解,函数是一组可以随时运行的语句,是一段代码块,也是所谓的子程序。在JavaScript中,函数实质上也是一种对象,是Function对象。函...

7410
来自专栏Java帮帮-微信公众号-技术文章全总结

07.Java变量类型

07.Java变量类型 Java 变量类型 在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下: ? 格式说明:type为Java数据类型。i...

42370

扫码关注云+社区

领取腾讯云代金券