专栏首页技术专栏Scala入门与进阶(三)- 函数

Scala入门与进阶(三)- 函数

1.函数的定义和使用

函数/方法的定义:

def 方法名(参数名:参数类型):返回类型 ={
    // 括号内的叫做方法体
    // 方法体内的最后一行为返回值,不需要return
}

image.png

package com.gwf.course03

object FunctionApp {

  def main(args: Array[String]): Unit = {
      println(add(1,1))
      println(three())
      println(three) // 没有入参的函数,调用时是可以省略的
      sayHello()
      sayHello
  }

  def add(x:Int,y:Int):Int={
    x+y // 最后一行就是返回值,不需要返回
  }

  def three()=1+2  // 可以自动判断返回类型

  def sayHello(): Unit ={ // Unit 代表没有返回值
      println("say hello")
  }
}
2
3
3
say hello
say hello

Process finished with exit code 0

2.默认参数

默认参数:在函数定义时,允许指定参数的默认值 $SPARK_HOME/conf/spark-defaults.conf

spark中的应用

image.png

3.命名参数

object FunctionApp {

  def main(args: Array[String]): Unit = {
      println(speed(100,10))
      println(speed(time=10,distance=100)) // 根据参数名进行传参 // 不建议
  }
  
  def speed(distance:Float,time:Float ):Float={
    distance/time
  }
  
}

4.可变参数

JDK5+ : 提供了可变参数

package com.gwf.course03

object FunctionApp {

  def main(args: Array[String]): Unit = {
      println(sum(1,2,3,4))
      println(sum(1,2,3))
      println(sum(Array(1,2):_*)) // 将数组传入可变参数的函数
  }



  def sum(numbers:Int*)={
    var result = 0
    for(num <- numbers){
      result += num
    }
    result
  }
}

spark-sql 中的应用

image.png

5.条件表达式

if(a>0) true else false

6.循环表达式

scala> 1 to 10 // 左闭右闭
res11: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> Range(1,10) // 左闭右开
res12: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> 1.to(10)  // 等同于 1 to 10
res13: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> Range(1,10,2) // 可以选择步长
res14: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

scala> Range(1,10,0) // 步长不可以为0,死循环
java.lang.IllegalArgumentException: step cannot be 0.
  at scala.collection.immutable.Range.<init>(Range.scala:86)
  at scala.collection.immutable.Range$.apply(Range.scala:439)
  ... 32 elided

scala>  Range(10,0,-1)  // 可以从大到小来
res16: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

scala> 1 until 10 // 左闭右开 底层调用的Range
res17: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

Range源码

/** Make a range from `start` until `end` (exclusive) with given step value.
   * @note step != 0
   */
  def apply(start: Int, end: Int, step: Int): Range = new Range(start, end, step)

@SerialVersionUID(7618862778670199309L)
@deprecatedInheritance("The implementation details of Range makes inheriting from it unwise.", "2.11.0")
class Range(val start: Int, val end: Int, val step: Int)
...

  @deprecated("This method will be made private, use `length` instead.", "2.11")
  final val numRangeElements: Int = {
    // 如果step==0则抛异常
    if (step == 0) throw new IllegalArgumentException("step cannot be 0.")
    else if (isEmpty) 0
    else {
      val len = longLength
      if (len > scala.Int.MaxValue) -1
      else len.toInt
    }
  }
  ...
}

常用循环

     for(i<-1 to 10 if i%2==0){  // if作用在前面生成的列表基础上
          println(i)
      }

      val courses = Array("spark sql","spark streaming","storm","scala")

      for(course<-courses){
        println(course)
      }

      //course其实就是courses里面的每个元素
      //==> 就是将左边的couse作用上一个函数,变成另外一个结果
      // println 就是作用到course.上的一个函数
      courses.foreach(course => println(course))

      var (num,sum) = (100, 0)
      while (num>0){
        sum+=num
        num -= 1
      }
      println(num)

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scala入门与进阶(五)- Scala数组

    Meet相识
  • HBase 在Linux&Mac 下的安装和配置

    详情参考 http://hbase.apache.org/book.html#quickstart

    Meet相识
  • 慕课网Flask构建可扩展的RESTful API-1. 起步与红图

    1.蓝图的作用并不是用来拆分视图函数的,而是用来拆分模块的 2.使用蓝图,统一个业务模型的试图函数的前缀都一样,代码重复啰嗦

    Meet相识
  • 深度 | 解读神经形态计算:从基本原理到实验验证

    机器之心原创 作者:Yujia 参与:Haojin、Nurhachu Null 长期以来,人脑一直给研究者们提供着灵感,因为它从某种程度上以有效的生物能量支持我...

    机器之心
  • 新研究用AI预测癫痫发作,准确率达99.6%

    癫痫(其英语为Epilepsy,源自古希腊文中的动词 “ἐπιλαμβάνειν”,意为“折磨”),对于我们来说并不是一种陌生的病症。这是一种长期性神经系统疾病...

    大数据文摘
  • 《一个操作系统的实现》笔记(4)-- Boot&Loader

    felix
  • 使用容器搭建自己的gitlab

    启动镜像,注意先建立/home/gitlab,免得容器销毁数据全无。 还要注意,因为git使用22号端口,这里映射的是1222端口。所以,只能使用http方式...

    超级大猪
  • 今日 Paper | 不确定性量化;边缘感知深度预测;双目深度估计;自适应深度立体匹配等

    论文名称:Uncertainty Quantification for Deep Context-Aware Mobile Activity Recogniti...

    AI科技评论
  • C+实现神经网络之壹—Net类的设计和神经网络的初始化

    闲言少叙,直接开始 既然是要用C++来实现,那么我们自然而然的想到设计一个神经网络类来表示神经网络,这里我称之为Net类。由于这个类名太过普遍,很有可能跟其他人...

    企鹅号小编
  • 《spss统计分析与行业应用案例详解》:实例十八 游程检验 实例十九 单样本K-S检验

    基本功能是可以判断样本序列是否为随机序列。这种检验过程是通过分析游程的总个数来实现的。

    统计学家

扫码关注云+社区

领取腾讯云代金券