Scala函数

Stella981
• 阅读 728

一、方法

    方法定义
    Scala中 + - * / % 的作用和Java一样,但是特别的是,这些操作符实际上是方法。
    1 to 10
    1.to(10)
    
    def m2(a:Int,b:Int): Int = a * b
    
    def m1(a:Int,b:Int):Int = {
        a + b
    }
    def:定义方法的关键字
    m1:方法名
    a:参数列表
    b:参数列表
    Int:返回值类型
    a + b:函数体

二、函数

1)方式1
    方法转换为函数
    方式:方法名 _
    res6: (Int, Int) => Int = <function2>
    <function2>
    代表一个函数,并且有两个参数。
    (Int, Int)
    代表参数列表
    Int
    代表返回值类型
    =>
    代表函数
    
    2)方式2
    定义函数:
    val h1 = (a:Int,b:Int) => {a * b}
    h1:函数名
    (a:Int,b:Int):函数的参数类型
    {a * b}:函数体

1、函数使用例子:

//1、定义方法m2计算a和b的积
scala> def m2(a:Int,b:Int):Int = a * b
m2: (a: Int, b: Int)Int

//2、调用方法m2
scala> m2(4,6)
res21: Int = 24

//3、方法m2转换为函数
scala> m2 _
res22: (Int, Int) => Int = <function2>

//4、定义一个参数的方法m1
scala> def m1(a:String) = println(a)
m1: (a: String)Unit

//5、调用方法m1
scala> m1("hello world")
hello world

//6、方法m1转换为函数
scala> m1 _
res24: String => Unit = <function1>

//7、定义两个参数的函数(简写)
scala> (a:Int,b:Int) => a * b
res25: (Int, Int) => Int = <function2>

//8、调用函数res25
scala> res25(5,8)
res26: Int = 40

//9、定义两个参数的函数(标准写法)
scala> (a:Int,b:Int) => {a * b}
res27: (Int, Int) => Int = <function2>

//10、定义函数h1
scala> val h1 = (a:Int,b:Int) => {a * b}
h1: (Int, Int) => Int = <function2>

//11、调用函数h1
scala> h1(4,9)
res28: Int = 36

三、传值调用&传名调用

    函数式编程:方法的参数可以是一个函数
    传值调用:
    1.先计算balance的值
    2.把这个值作为参数传递给printMoney
    传名调用:传递的是函数
    将balance方法的名称传递到方法内部执行

1、传值调用

package com.demo.scala02

/**
  * 传值调用
  * 1.先计算balance的值
  * 2.把这个值作为参数传递给printMoney
  */
object ZFBToPay {
  var money = 1000

  // 吃饭一次花50元
  def eat(): Unit = {
    money = money - 50
  }

  // 余额
  def balance(): Int = {
    //已调用一次eat方法
    eat()
    money
  }

  def printMoney(x: Int): Unit = {
    for(a <- 1 to 5){
      println(f"你的余额现在为:$x")
    }
  }

  def main(args: Array[String]): Unit = {
    eat()
    balance()
    printMoney(balance())
  }
}

输出结果

Scala函数

2、传名调用

package com.demo.scala02

/**
  * 传名调用
  * 传递的是函数
  * 将balance方法的名称传递到方法内部执行
  */
object ZFBToPay2 {
  var money = 1000

  // 吃饭一次花50元
  def eat(): Unit = {
    money = money - 50
  }

  // 余额
  def balance(): Int = {
    // 已调用一次eat方法
    eat()
    money
  }

  // 此时余额减了5次 x: => Int 表示的是一个方法的签名 没有参数 返回值是Int类型的函数
  def printMoney(x: => Int): Unit = {
    for(a <- 1 to 5){
      println(f"你的余额现在为:$x")
    }
  }

  def main(args: Array[String]): Unit = {
    // eat()
    // balance()
    printMoney(balance())
  }
}

输出结果

Scala函数

四、可变参数函数

java中的可变参数:public static void m1(String ...arg){}
    scala中的可变参数:def sum(ints:Int*): Int ={}
    加了通配符*

1、java中的可变参数

package com.demo.scala02;

public class JavaTest {
    // java中的可变参数
    public static void m1(String ...args){

    }

    public static void main(String[] args) {
        m1("a");
        m1("a", "b", "c");
    }
}

2、scala中的可变参数

package com.demo.scala02

object ManyParam {
  // scala中的可变参数
  def sum(ints: Int*): Int = {
    var sum = 0
    for(v <- ints){
      sum += v
    }
    sum
  }

  /*
    不仅是可变参
    而且参数的类型不一致
    Any
   */
  def setName(params: Any*): Any = {
    return params
  }

  def main(args: Array[String]): Unit = {
    println(sum(1,2,3,4))
    println(sum(2,3))
    println(setName("John",18,188))
  }
}

输出结果

Scala函数

五、默认参数值函数

  如果传递了参数,则使用传递的值。如果不传递参数,则使用默认值。

1、例子

package com.demo.scala02

object DefaultParam {
  /*
    如果调用此方法且不给参数,要一个默认值。
   */
  def sum(a: Int = 3,b: Int = 7): Int = {
    a + b
  }

  def main(args: Array[String]): Unit = {
    // 如果传递了参数,则使用传递的值。如果不传递参数,则使用默认值。
    println(sum())
    println(sum(2,4))
  }
}

输出结果

Scala函数

六、高阶函数

定义:将其他函数作为参数,或者其结果是函数的函数。

1、例子

package com.demo.scala02

object GaoJie {
  // 将其他函数作为参数,或者其结果是函数的函数
  def getPerson(h: Int => String,f: Int): String = {
    //函数h 参数f
    h(f)
  }

  def Person(x: Int) = "我是" + x.toString + "岁很帅的lz"

  def main(args: Array[String]): Unit = {
    println(getPerson(Person,18))
  }
}

七、部分参数应用函数

    如果函数传递所有预期的函数,则表示完全应用它了。
    如果只传递几个参数,并不是全部参数,那么将返回部分应用的函数。

1、例子

package com.demo.scala02

import java.util.Date

object PartParam extends App {
  def log(date: Date,message: String): Unit = {
    //参数打印
    println(s"$date,$message")
  }
  val date = new Date()
  val logMessage = log(date,_:String)

  log(date, "hello world")
  logMessage("2018马上要过去了!")
}

输出结果

Scala函数

2、命令行例子

scala> val sum = (a:Int,b:Int) => {a + b}
sum: (Int, Int) => Int = <function2>

scala> sum(1,)
<console>:1: error: illegal start of simple expression
sum(1,)
      ^

scala> sum(1,_:Int)
res0: Int => Int = <function1>

scala> res0(2)
res1: Int = 3

scala> res0(20)
res2: Int = 21

八、字符串的格式化输出

文字插值器:f/s

1、例子

scala> val name = "lz"
name: String = lz

scala> var age = 18
age: Int = 18

scala> println("name:"+name+" age:"+age)
name:lz age:18

scala> println(f"name=$name age=$age")
name=lz age=18

scala> printf(s"name=$name age=$age")
name=lz age=18
scala> println(s"name=$name age=$age")
name=lz age=18

scala> println(s"1 + 1 = ${1+1}")
1 + 1 = 2

scala> println(f"1 + 1 = ${1+1}")
1 + 1 = 2

九、柯理化

    指的是将原来接收的两个参数的函数变为一个新的接收一个参数的函数,这样的一个过程。
    函数的通用性降低,但是适用性提高

1、例子

scala> def sum(a:Int,b:Int) = a + b
sum: (a: Int, b: Int)Int

scala> def sum(a:Int)(b:Int) = a + b
sum: (a: Int)(b: Int)Int

scala> sum(1,2)
<console>:13: error: too many arguments for method sum: (a: Int)(b: Int)Int
       sum(1,2)
          ^

scala> sum(1)(2)
res11: Int = 3

十、偏函数

    被包在花括号内没有match的一组case语句的是一个偏函数。
    PartialFunction[A,B]
    A: 参数类型
    B:返回类型
    常用与模式匹配。

1、例子

package com.demo.scala02

object PartialFunction {

  //定义函数
  def func(str: String): Int = {
    if(str.equals("lz")) 18 else 0
  }

  //定义偏函数
  def func1:PartialFunction[String, Int] = {
    //如果使用了偏函数必须用case
    case "lz" => 18
      //如果其他
    case _ => 0
  }

  def main(args: Array[String]): Unit = {
    println(func("lz"))
    println(func1("Lz"))
    println(func1("lz"))
  }
}

输出结果

Scala函数

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这