大数据之scala_scala之函数和方法

函数

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

函数的定义
方式一

val | var 函数名称=(函数的参数列表) => 函数体 
val add = (x: Int, y: Int) => {
  x + y
}
val parseStr = (str: String) => {
  str.toUpperCase()
}
//  函数体中的内容只有一行代码可以省略大括号
 var product = (x:Double) => x*x

在这里插入图片描述

函数可以作为最终的表达式存在,返回的内容就是函数的签名 签名(函数的名称,函数的参数,函数的返回值类型) 这种定义方式不需要指定返回值类型,编译器会自动推断

方式二
val | var 函数名称:(输入参数类型)=> 返回值类型 = (参数的引用)=> 函数体

在这里插入图片描述

// 函数定义的第二种种方式

val add2:(Int,Int)=>Int=(x,y)=>{
  x+y
}

add2 函数名
(Int ,Int) 要处理的参数类型列表
=>Int 函数处理完数据的返回值类型
=(x,y) 传入实际参数的接收变量名
{x+y} 函数体 运算求和
注意: 代码块的最后一行是函数的返回值 ,需要和=>(Int)类型保持一致

特殊的没有参数的函数

 val show:()=>Unit=()=>{
   println("show.....")
 }
 
 val  show2=()=>{
   println("show2......")
 }
 
 val get:()=>String=()=>{
   "给你们"
 }
 // 没有参数的函数 自动推断类型
val get2=()=>{
  ""
}

函数细节
函数中的参数;列表可以有多个,也可以没有参数 ,没有参数的函数调用的时候不用写()
函数的参数和返回值可以是值类型,也可以是引用类型,
方法的参数和返回值有一个是函数的方法就是高阶函数(方法)
函数的最后一行为推断函数返回值的重要依据 , 可以省略return
函数中可以在声明函数

方法

方法是逻辑片段的封装 ,可以处理一个或者多个数据 , 可以有返回值也可以没有没有返回值 ,提高了代码的复用性
方法的定义

def functionName ([参数列表]) : [return type] = {
   function body
   return [expr]
}

没有等号和方法体的方法称为抽象方法,抽象方法定义在抽象类和特质中

// 定义一个方法 有两个参数  有返回值
def add(x:Int , y:Int):Int={
  val sum = x + y
  sum
  // return 可以省略 , 代码块的最后一行就是这个方法的返回值
//  return sum
}

/**
  * 定义一个没有参数没有返回值的方法  Unit关键字代表没有返回值 类似于java中的void
  */
 def show()={
  println("show......")
}
/**
  * 如果方法没有参数  方法后面的() 可以省略  ,注意在调用的时候也不要书写小括号
  */
def show2={
  println("show......")
}
// 在抽象类或者特质中定义抽象方法
def m1

方法的调用

  • 方法的调用和java中的调用方式不太一样
  • 如果方法定义在object中 在本类直接方法名调用 在其他类中调用 object 对象名调用
  • 如果方法定义在普通的class 类中 , 本类之间直接调用! 其他类中new 类 .方法调用
    嵌套方法
    嵌套的方法必须指定返回值类型
def  factorial(x:Int):Int={
  def fact(x:Int ,y:Int):Int={
    if(x<=1) y
    else fact(x-1 , x*y)
  }
  fact(x,1)
}

方法总结
注意方法的参数和返回值可以是函数 ,这样的方法称为高阶函数 ,高阶函数中详细讲解
1,定义方法的关键字,def
2,方法的返回值,最后一行的内容,如果是循环,那么返回值是 Unit
3,如果空参方法,定义的时候有(),调用的时候可以省略(),但是如果定义的时候没 有(),调用方法的时候,不能加()
4,方法的返回值类型,可以省略,但是特殊情况下,必须加上:
4.1,方法有 return 关键字
4.2,递归调用的方法。
5,方法不能最为最终的表达式存在,(空参的方法调用除外)

二分查找方法

def binarySearch(arr: Array[Int], find: Int): Int = {
  if (arr.length == 0) {
    println("数组为空")
    return -1
  }
  // 对待排的数组排序
  val sorted: Array[Int] = arr.sorted
// 起始位置所以
  var start = 0
// 检索的最后一个元素
  var end = arr.length - 1
  while (start <= end) {
    val midd = (start + end) / 2
    if (sorted(midd) > find) {
      end = midd - 1
    } else if (sorted(midd) < find) {
      start = midd + 1
    } else {
      println(s"$find in index :$midd")
      return midd
    }
  }
  return -1
}

函数和方法
互相转换

def add(x: Int, y: Int) = {
  x + y
}
// 将方法转换成函数
val f = add _

当我们看见方法作为参传递的时候 ,其实底层是将方法自动转换成函数

区别
在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递
函数可以当成值来进行传递,方法的参数和返回值都可以是函数。
函数和变量,类,对象, 是一个级别的。
区别和联系:
1,方法用 def 关键字定义,函数的标识 =>
2,方法不能作为最终的表达式存在,但是函数可以,返回函数的签名信息
3,方法和函数调用的时候都需要显示的传入参数
4,函数可以作为方法的参数,和返回值类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值