scala05-函数式编程01

函数和方法

package com.zishi.scala.a02.okk05

object Test01_FunctionAndMethod {

  /**
   * public void main(final String[] args) {
   *    sayHi$1("alice");  -- 这里调用的就是:sayHi$1
   *    this.sayHi("bob");
   *    String result = this.sayHello("cary");
   *    .MODULE$.println(result);
   * }
   *
   * @param args
   */
  def main(args: Array[String]): Unit = {

    /**
     * 定义函数
     * 该函数不能重载
     *
     * 编译之后的字节码为:
     * private static final sayHi$1(name: String): Unit =  {
     *  MODULE$.println((new StringBuilder(4)).append("hi, ").append(name).toString)
     * }
     * 增加了修饰符:private static final
     * 方法名被修改了:sayHi$1
     *
     * @param name
     */
    def sayHi(name: String): Unit = {
      println("hi, " + name)
    }

    // 不能重载  sayHi is already defined in the scope
    /*def sayHi(i: Int): Unit = {
      println("hi, " + i)
    }*/

    // 调用函数,不加任何的操作,默认调用函数
    // 如果没有函数,则调用方法
    sayHi("alice")  // 这里调用的是函数

    // 调用对象方法
    Test01_FunctionAndMethod.sayHi("bob")

    // 获取方法返回值
    val result = Test01_FunctionAndMethod.sayHello("cary")
    println(result)
  }

  // 定义对象的方法
  def sayHi(name: String): Unit = {
    println("Hi, " + name)
  }

  def sayHello(name: String): String = {
    println("Hello, " + name)
    return "Hello"
  }
}

函数的定义

package com.zishi.scala.a02.okk05

object Test02_FunctionDefine01 {
  def main(args: Array[String]): Unit = {
    //    (1)函数1:无参,无返回值
    def f1(): Unit = {
      println("1. 无参,无返回值")
    }

    f1()
    println(f1())

    println("=========================")

    //    (2)函数2:无参,有返回值
    def f2(): Int = {
      println("2. 无参,有返回值")
      return 12
    }

    println(f2())

    println("=========================")

    //    (3)函数3:有参,无返回值
    def f3(name: String): Unit = {
      println("3:有参,无返回值 " + name)
    }

    println(f3("alice"))

    println("=========================")

    //    (4)函数4:有参,有返回值
    def f4(name: String): String = {
      println("4:有参,有返回值 " + name)
      return "hi, " + name
    }

    println(f4("alice"))

    println("=========================")

    //    (5)函数5:多参,无返回值
    def f5(name1: String, name2: String): Unit = {
      println("5:多参,无返回值")
      println(s"${name1}${name2}都是我的好朋友")
    }

    f5("alice", "bob")

    println("=========================")

    //    (6)函数6:多参,有返回值
    def f6(a: Int, b: Int): Int = {
      println("6:多参,有返回值")
      return a + b
    }

    println(f6(12, 37))
  }
}

函数的可变参数

package com.zishi.scala.a02.okk05

object Test03_FunctionParameter {
  def main(args: Array[String]): Unit = {
    //    (1)可变参数
    def f1(str: String*): Unit = {
      println(str)
    }

    f1("alice") // ArraySeq(alice)
    f1("aaa", "bbb", "ccc") // ArraySeq(aaa, bbb, ccc)

    //    (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后
    def f2(str1: String, str2: String*): Unit = {
      println("str1: " + str1 + ",str2: " + str2)
    }

    // 可变参数不确定,底层实现的方式也不一样
    f2("alice") // str1: alice,str2: List()
    f2("aaa", "bbb", "ccc") // str1: aaa,str2: ArraySeq(bbb, ccc)

    //    (3)参数默认值,一般将有默认值的参数放置在参数列表的后面
    def f3(name: String = "eeeee"): Unit = {
      println("My school is " + name)
    }

    f3("school")
    f3()

    //    (4)带名参数
    def f4(name: String = "eeeee", age: Int): Unit = {
      println(s"${age}岁的${name}在smmmca学习")
    }

    f4("alice", 20)
    f4(age = 23, name = "bob")
    f4(age = 21)
  }
}

函数的至简原则

package com.zishi.scala.a02.okk05

/**
 * 函数至简原则
 */
object Test04_Simplify {

  def main(args: Array[String]): Unit = {

    def f0(name: String): String = {
      return name
    }

    println(f0("erfearfere"))

    println("==========================")

    //(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值
    def f1(name: String): String = {
      name
    }

    println(f1("erfearfere"))

    println("==========================")

    //(2)如果函数体只有一行代码,可以省略花括号
    def f2(name: String): String = name

    println(f2("erfearfere"))

    println("==========================")

    //(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
    def f3(name: String) = name

    println(f3("erfearfere"))

    println("==========================")

    //    (4)如果有return,则不能省略返回值类型,必须指定
    //    def f4(name: String) = {
    //      return name
    //    }
    //
    //    println(f4("erfearfere"))

    println("==========================")

    //(5)如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用
    def f5(name: String): Unit = {
      return name
    }

    println(f5("f5 erfearfere"))

    println("==========================")

    /**
     *(6)Scala如果期望是无返回值类型,可以省略等号
     * =号省略的前提是 没有返回值
     * @param name
     */
    def f6(name: String) {
      println(name)
    }

    println(f6("f6 erfearfere"))

    println("==========================")

    //(7)如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加
    def f7(): Unit = {
      println("f7")
    }

    f7()
    f7

    println("==========================")

    //(8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
    def f8: Unit = {
      println("f8  f8")
    }

    /**
     * 省略参数列表的小括号
     * 省略返回值类型
     * 省略方法体的花括号
     */
    def f82 = println("f8  f8")

    f82
    //f8()
    f8

    println("==========================")

    //(9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略
    def f9(name: String): Unit = {
      println(name)
    }

    // 匿名函数,lambda表达式,无参函数
    () => {
      println("Hello lambda")
    }

    // 匿名函数,lambda 表达式,这里是有参函数
    (name: String) => {
      println(s"aaa ${name}", name)
    }

    println("-------------------")
  }
}

函数也是对象

package com.zishi.scala.a02.okk05

/**
 * 函数至简原则
 */
object Test04_Simplify02 {

  def main(args: Array[String]): Unit = {
    /**
     * Scala是面向对象的语言,万物皆对象,
     * 所以函数也是对象
     *
     * 既然函数是对象,
     * 1. 那么函数这个对象应该有类型,
     * 2. 并且可以赋值给其他人使用
     */
    def test() = {
      println("111")
    }

    // 调用了test函数,可以省略小括号
    test
    //打印函数返回结果,Unit结果是()
    println(test)

    // 打印了test对象 com.zishi.scala.okk05.Test05_Lambda$$$Lambda$16/0x00000008000d7840@41ee392b
    println(test _)

    // 函数对象test赋值给一个变量f2
    // 函数的类型为:Function0[Unit]
    // 0表示函数参数列表为0
    // Unit表示函数的返回值为Unit
    // val f2: Function0[Unit] = test _

    // 这是 val f2: Function0[Unit] = test _的变形
    // () => Unit 表示函数f2的类型
    val f2: () => Unit = test _
    println(f2) //com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$17/0x00000008000d7c40@57d5872c
    println("...........")
    f2() // 函数调用


    // 增加难度
    def test1(age: Int): String = {
      "hello:" + age
    }

    //函数的类型为:Function1[Int, String]
    // 1表示函数参数列表为1个
    // [Int, String]中Int表示函数的参数列表是Int,String表示返回值是String:
    // 函数对象的参数最多22个
    val f3: Function1[Int, String] = test1
    // f4 的函数类型为:(Int) => String, 输入一个Int,返回一个String
    // TODO: 这是另外一种表示形式  Function1[Int, String] 等价于 (Int) => String
    val f4: (Int) => String = test1
    println(f3) // com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$18/0x00000008000d6840@36f0f1be
    println(f4) // com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$19/0x00000008000d6040@6ee12bac

    f4(4) // 这里是方法调用,  类似Java中的对象调用方法: user.xxxx

  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/496074.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】之类和对象(中)

【C初阶】之类和对象(中) ✍ 类的六个默认成员函数✍ 构造函数🏄 为什么需要构造函数🏄 默认构造函数🏄 为什么编译器能自动调用默认构造函数🏄 自己写的构造函数🏄 构造函数的特性 ✍ 拷贝构造…

原型链-(前端面试 2024 版)

来讲一讲原型链 原型链只存在于函数之中 四个规则 1、引用类型,都具有对象特性,即可自由扩展属性。 2、引用类型,都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象。 3、引用类型,隐式原型 __proto__ 的属…

Java官网64位下载:获取高效、安全的Java平台

Java官网64位下载:获取高效、安全的Java平台 Java是一种广泛应用于软件开发和跨平台应用程序的编程语言。无论是开发桌面应用程序、移动应用程序还是大型企业级系统,Java都是一种可靠且强大的选择。为了确保你获取到高效、安全的Java平台,本文…

supervision CV视觉可视化辅助工具

参考: https://supervision.roboflow.com/latest/ https://github.com/roboflow/supervision/tree/develop/examples 版本: pip install -U supervisionultralytics-8.1.35 (大于8.1才行,不然可能会有错误AttributeError: ‘Res…

第5章.零、单例与小样本提示词的编写之道

零提示、单个提示和小样本提示是用于从ChatGPT中生成文本的技术。在数据匮乏或任务全新、定义模糊之时,我们用微妙的提示,让ChatGPT从无到有,生成文本。 面对任务,空无一例:模型凭借对任务的广泛理解,独辟…

贝锐蒲公英虚拟DMZ:工业设备异地组网,解决网段冲突难题

虚拟DMZ 产品/技术的原理传统DMZ: DMZ中文名称为“隔离区”,也称“非军事化区”;它是为解决安装防火墙后外部网络不能访问内部网络服务器的问题。网关DMZ功能开启后, 将内网的一台服务器完全暴露在外网(内网某个IP绑…

在CentOS7上部署Nginx并测试指南

Nginx部署测试 Nginx简介 Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。 Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、CPU等系统资源消耗非常低,运行稳定。 正向代理与反向代理 正向代…

Swift 周报 第四十八期

文章目录 前言新闻和社区苹果突然不造车了,雷军:非常震惊!分析师:马斯克或是最大赢家你会爱上的开发者活动 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第四十八期…

【MySQL】16.事务管理(重点) -- 2

1. 事务隔离级别 如何理解隔离性1 MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行一个事务可能由多条SQL构成,也就意味着,任何一个事务,都有执行前,执行中,执行后的阶段。而所…

基于Echarts的超市销售可视化分析系统(数据+程序+论文)

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示,帮助决策层更好地了解销售情况和趋势,进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

基于随机森林与LSTM神经网络的住宅用电比较分析及预测 代码+论文 完整毕设

摘要 本文旨在探讨基于随机森林(Random Forest)与长短期记忆神经网络(Long Short-Term Memory, LSTM)的住宅用电比较分析及预测方法。随机森林是一种集成学习方法,通过构建多个决策树进行预测,具有较强的鲁…

FL Studio21.2.3.4004音乐制作及里程碑及功能介绍

**FL Studio 21.2.3.4004:音乐制作的新里程碑** 随着数字音乐制作技术的不断发展,音乐制作软件也在不断迭代升级。今天,我们将聚焦于一款广受欢迎的音乐制作软件——FL Studio 21.2.3.4004,探讨它如何成为音乐制作领域的新里程碑…

【技巧】如何设置和解除PDF的“打开密码”?

在工作中,我们经常会接触到PDF文件,对于重要的文件,往往还会设置密码保护,那PDF的“打开密码”如何设置和解除呢?下面小编分享两种方法,一起来看看吧! 方法一:使用PDF编辑器 大部分…

基于连续深度编解码器网络的医学图像鲁棒边界分割

基于连续深度编解码器网络的医学图像鲁棒边界分割 摘要引言相关工作方法-----III. PROPOSED METHOD Robust_Boundary_Segmentation_in_Medical_Images_Using_a_Consecutive_Deep_Encoder-Decoder_Network 摘要 图像分割通常用于定位目标和边界。它在许多临床应用中是必不可少的…

一步一步搭建,功能最全的权限管理系统之动态路由菜单

一、前言 这是一篇搭建权限管理系统的系列文章。 随着网络的发展,信息安全对应任何企业来说都越发的重要,而本系列文章将和大家一起一步一步搭建一个全新的权限管理系统。 说明:由于搭建一个全新的项目过于繁琐,所有作者将挑选核心…

1320亿参数,性能超LLaMA2、Grok-1!开源大模型DBRX

3月28日,著名数据和AI平台Databricks在官网正式开源大模型——DBRX。 DBRX是一个专家混合模型(MoE)有1320亿参数,能生成文本/代码、数学推理等,有基础和微调两种模型。 根据DBRX在MMLU、HumanEval和 GSM8K公布的测试…

蓝牙双模音频模块支持串口AT指令控制介绍

目录 一、BT401蓝牙音频模块简介 蓝牙音频模块支持串口AT指令控制介绍,这里推荐BT401蓝牙模块,功能简介如下: BT401模块是一款支持蓝牙、U盘、TF卡播放的5合1的解决方案。模组的亮点在支持无损音乐的播放,以及简单明了的串口控制…

婴儿专用洗衣机哪个牌子好?四大爆款婴儿洗衣机合集安利

婴儿的衣物需要特别的护理,因为婴儿的皮肤非常娇嫩,需要一个无菌,没有刺激性的洗涤环境,于是婴儿洗衣机应运而生。如果你非常注重婴儿衣物的卫生问题,那么婴儿洗衣机则是非常理想的选择。毕竟,在婴儿吃奶或…

文件上传失败原因分析与解决

图片文件上传失败 问题描述&#xff1a;在前端开发时&#xff0c;需要通过表单元素上传图片或其他文本&#xff0c;但是上传不成功&#xff0c;后端接口也没问题 html <!--onChange用来绑定数据 handleUpload用来提交数据--><form onSubmit{handleUpload}><…

Cadence HDL导出BOM并将网页数据导入Excle

【仅供个人学习记录&#xff0c;勿作他用。转载注明出处】 1. 如何导出BOM&#xff1f; 【说明】将后缀改为网页“html”&#xff0c;并勾选下面的网页。 之后就会跳出浏览器中你的BOM表就会显示。 2. 将网页BOM导入Excle&#xff1f; 不想要这个 想要这个&#xff01;&…
最新文章