Scala013--Scala中的方法

news2024/9/28 23:50:17

因为Scala是一种函数式编程语言,因此在Scala中基本上都是方法和函数,但是需要注意的是,在Java中方法和函数是同一个意思,但是在Scala中函数和方法的含义不同:

  1. 方法:是类和对象的成员
  2. 函数:是对象

在这一篇文章中我先来认识方法。

目录

【方法】

一,运算符作为方法被调用

 二,方法的定义

1,定义无参无返回值的方法

1)完整的定义

 2)简写的定义

2,定义有参有返回值的方法

 三,递归方法

1,年龄问题

2,斐波那契数列

 3,兔子吃萝卜

4,打印指定目录下的所有非目录文件


【方法】

一,运算符作为方法被调用

普通的加减乘除等在Scala中都可以是方法,在Java中的加减乘除不是方法,而是一种运算符。光讲会有点枯燥,现在我使用代码来看一下在Scala中,运算符作为方法被调用的写法及效果。

我将让整型3加双精度型3

scala> 3.+(3:Double) // 不管是什么计算机语言,默认输入的整数都是int类型,如果想要该数字为double类型可以指定类型为Double
res4: Double = 6.0

 二,方法的定义

Scala中方法的定义格式:

def  方法名([变量名1:变量类型,变量名2:变量类型]) :[返回值类型]={方法体}

解释:[]:方括号表示可有可无,是可选项。

因为Scala可以进行类型推断,所以返回值类型也可以省略,所以以上的定义格式也可以写成:

def  方法名([变量名1:变量类型,变量名2:变量类型])={方法体}

1,定义无参无返回值的方法

对于Scala中无参无返回值的方法来来说,参数列表是可以省略的。

现在我定义一个名为function的方法,并且无参无返回值:

1)完整的定义

scala> def function():Unit={println("我是一个无参无返回值的方法")}

 2)简写的定义

scala> def function=println("我是一个无参无返回值的方法")
function: Unit

在上面,相信大家也发现了,在简写定义一个方法时,我把方法体外面的花括号给去掉了,但是调用方法之后还是依旧可以输出方法体的内容,这是为什么?主要是因为在Scala的方法中,如果方法体只有一条语句,那么方法体外面的花括号可以省略不写。但是如果有很多条的话就不能够省略,如下,此时的function方法体里面不再是简单的一条输出语句,还涉及到了一些逻辑运算,这个时候如果不加上花括号的话就会报错:

def function=val a=11;val b=23; println(s"我是一个无参无返回值的方法,方法中两个变量的和为${a+b}")

接着我加上了花括号之后就会正常输出:

def function={val a=11;val b=23; println(s"我是一个无参无返回值的方法,方法中两个变量的和为${a+b}")}

在Scala中默认是以最后一条语句作为返回值返回的,所以现在我将方法体里面的两个变量的和写在了方法体的最后一句,那么就会返回a+b的值,且这个时候方法function的返回值类型为Int类型:

def function={val a=11;val b=23; println(s"我是一个无参无返回值的方法,方法中两个变量的和为${a+b}");a+b}

 并且在调用该方法的时候也会将a+b的结果作为方法function的返回值返回:

 如果在方法体中写上了return关键字,就必须在参数列表的后面显式的指定方法的返回值,不然就会报错。

 现在我加上了该方法的返回值后,结果如下:

 def function:Int={val a=11;val b=23; println(s"我是一个无参无返回值的方法,方法中两个变量的和为${a+b}");return a+b}

 总而言之,在Scala方法的定义中要不要写return关键字,看个人。

[我一般不写,反正有Scala虚拟机帮我进行数据类型的推断,就没啥必要去写了,还省事]。

2,定义有参有返回值的方法

相比于无参无返回值的方法,有参有返回值无非就是方法的参数列表中有参数不能省略,即使有返回值也可以不用写return,只需要将要返回的值写在方法体的最后一行即可。

现在我定义一个有两个Int类型的参数并且返回值为Int类型的方法function:

/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 * 个人代码规范:
 * 1,原始数据的变量命名:①只使用单个单词即数据的类型:无嵌套的数据结构②被嵌套的数据结构类型_嵌套的数据结构类型:嵌套的数据结构
 * 2,接收结果的变量命名:①包含的数据类型1_包含的数据类型2_返回的变量类型_表达式中使用到的函数1_表达式中使用到的函数2
 * 3,调用函数时的注释:①数据调用第一个函数输出的结果为:函数名-OUT;函数名-OUT....以此类推
 *
 */
object Method1 {
  // 定义有参有返回值的方法
  def function(a:Int,b:Int)={   // 有参的方法
    println(s"a+b=${a+b}") //  用于打印变量a和变量b的和
    a+b  // 返回值为Int类型
  }
  def main(args: Array[String]): Unit = {
     // 调用方法
     val ob=Method1  //  创建对象
     ob.function(22,33)  // 使用对象来调用方法
  }
}

 方法的返回值得需要类或者是对象调用方法之后咋再去调用打印语句输出返回值,不然就不会有任何输出。上面我之所以有输出是因为我在方法体里面就写上了打印语句:

 如果把这句打印语句注释掉,对象或者是类在调用方法function并且无任何打印,那么就会无任何输出:

三,递归方法

递归的解释:程序调用自身的编程技巧称为递归。

在数学上也存在递归的现象,如:斐波那契数列,阶乘等。使用了递归的方法就称为递归方法。

接下来我使用几个案例结合递归的方法来解决问题

1,年龄问题

有八个人围坐在一起,问第八个人的年龄,他说比第七个人大两岁,之后去问第七个人的年龄,他比第六个人大两岁,以此类推,两个人之间相差的年龄为2。当问第一个的年龄是他说是10岁。问:第八个人几岁?

分析题目可知:每一个人的年龄都是上一个人的年龄加2得到,因此,可以使用2加上自身即可。


/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 * 个人代码规范:
 * 1,原始数据的变量命名:①只使用单个单词即数据的类型:无嵌套的数据结构②被嵌套的数据结构类型_嵌套的数据结构类型:嵌套的数据结构
 * 2,接收结果的变量命名:①包含的数据类型1_包含的数据类型2_返回的变量类型_表达式中使用到的函数1_表达式中使用到的函数2
 * 3,调用函数时的注释:①数据调用第一个函数输出的结果为:函数名-OUT;函数名-OUT....以此类推
 *
 */
object Digui1 {
  /**
   *  nu=1 :OUT=>10
    nu=2 :OUT=>2+function(1)=>2+10=>12
    nu=3 :OUT=>2+function(2)=>2+2+function(1)=>2+2+10=>14
    .
    .
    以此类推
    num=8 :OUT=>2+function(7)=>2+2+function(6)=>2+2+2+function(5)=>2+2+2+2+function(4)=>2+2+2+2+2+function(3)
   * @param num 表示为第几个人
   * @return:返回值为int类型
   */
  def function(num:Int): Int ={  // 定义一个参数为int类型,返回值类型也为int的方法
    if (num==1) { // 第一个人的年龄
       10
    }
    else{
      2+function(num-1)   // 返回2加上一个人的年龄
    }
  }
  def main(args: Array[String]): Unit = {
    println(Digui1.function(8))  // 使用类来调用方法,并调用prntln打印结果
  }

}

2,斐波那契数列

该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。

形如:0 1 1 2 3 5 8 13 21 34.....function(n-1)+function(n-2)

请定义一个方法function(num:Int),并打印输出斐波那契数列的第九项:

,当num=9时,输出21

/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 * 个人代码规范:
 * 1,原始数据的变量命名:①只使用单个单词即数据的类型:无嵌套的数据结构②被嵌套的数据结构类型_嵌套的数据结构类型:嵌套的数据结构
 * 2,接收结果的变量命名:①包含的数据类型1_包含的数据类型2_返回的变量类型_表达式中使用到的函数1_表达式中使用到的函数2
 * 3,调用函数时的注释:①数据调用第一个函数输出的结果为:函数名-OUT;函数名-OUT....以此类推
 *
 */
object DiGui2 {
  /**
   * 该数列由0和1开始,后面的每一项数字都是前面两项数字的和
   * @param num:表示第几个数
   * @return Int:返回值为int类型的数据
   */
    def function(num:Int): Int ={
      if(num==1){   // 如果传入的数字为0或者是1直接返回1
        0
      }
      else if(num==2){
          1
        }
      else {
        // 后一项为前两项相加之和
        function(num-1)+function(num-2)
      }
    }
  def main(args: Array[String]): Unit = {
    println(DiGui2.function(9))
  }
}

 3,兔子吃萝卜

兔子拔了一堆萝卜,第一天吃了一半,还嫌不过瘾,又吃了一个,第二天又将剩下的萝卜吃掉一半,又多吃了一个,以后每天如此.到第10天想再吃时,见只剩下一个萝卜了,求第一天共拔了多少萝卜.

个人分析【仅供参考】:

第十天:1

第九天:(1)*2+1

第八天:【(1)*2+1】*2+1

.

.

.

第一天:【第二天的萝卜数】*2+1即function(day+1)*2+1

现在我使用代码来查看具体的实现效果:

/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 * 个人代码规范:
 * 1,原始数据的变量命名:①只使用单个单词即数据的类型:无嵌套的数据结构②被嵌套的数据结构类型_嵌套的数据结构类型:嵌套的数据结构
 * 2,接收结果的变量命名:①包含的数据类型1_包含的数据类型2_返回的变量类型_表达式中使用到的函数1_表达式中使用到的函数2
 * 3,调用函数时的注释:①数据调用第一个函数输出的结果为:函数名-OUT;函数名-OUT....以此类推
 *
 */
object DiGui3 {
  /**
   * @param day:第几天
   * @return:返回值为Int类型【萝卜数】
   */
  def function(day:Int):Int ={  // 定义一个方法
    if(day==10){
      1
    }
    else {
      function(day+1)*2+1  
      /*
      day=10 => function(10)=>1
      day=9  => function(9+1)*2+1 => function(10)*2+1 =>1*2+1=>3
      day=8  => function(8+1)*2+1 => function(9)*2+1=> function(9)=3 => 3*2+1=7
      .
      .
      .
       */
    }
  }
  def main(args: Array[String]): Unit = {
    println(DiGui3.function(1))  // 类来调用方法并向方法中传入参数值
  }

}

4,打印指定目录下的所有非目录文件

 请查找并打印出目录下的所有文件,如果是文件则直接打印出来,是目录的话就进行递归查找:

import  java.io.File  // 导包
/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 */
object FindFile {
  /**
   * findFile方法用于遍历指定目录下的文件,
   * 如果该目录下还有目录,则去递归找到子目录下的文件
   * @param file :需要传入文件对象
   */
  def findFile(file_object:File):Unit={
     // 如果为目录则就行递归,不是目录则不用进行递归
    if(file_object.isFile){   // isFile用于判断当前的文件对象是否是文件
      println(s"${file_object.getName}不是目录,无法进行递归")  // getName方法用于获取当前文件对象的名字
    }
    else{
      val file_list=file_object.listFiles()  // 得到文件列表
      for(file <- file_list){  // 遍历文件列表
         if (file.isFile){
           println(file)
         }else{
           findFile(file)  // 是目录,就进行递归查找
         }
      }
    }
  }
  def main(args: Array[String]): Unit = {
    val file_object=new File("C:\\Program Files (x86)\\Common Files")  // 创建文件对象
     findFile(file_object)  //  直接调用方法
  }
}

 以上就是Scala中方法的基本内容,我的学习完成,有问题的欢迎在评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jeecgboot-前端组件封装代码示例

首先我们要知道 jeecgboot他前台的组件代码封装文件夹的位置在src-components中&#xff0c;这时我们其实可以观察他们代码的写法(个人感觉学习代码的最好的途径就是临摹他人高质量的代码、多看、多写)路径如图&#xff1a; 接下来我们会在标注3下实现一个简单的自定义组件 代码…

【Eureka】【源码+图解】【八】Eureka客户端的服务获取

【Eureka】【源码图解】【七】Eureka的下线功能 目录7. 获取服务7.1 初始化HeartBeat的task7.2 将task进一步包装成定时timerTask7.3 定时时间到&#xff0c;执行timeTask7.4 task获得线程资源&#xff0c;执行refreshRegistry()7.5 服务端接受请求7.6 获取Applications7. 获取…

Spark - RDD 的分区和Shuffle

一、RDD 的分区 前面在学习 MapReduces 的时候就提到分区&#xff0c;在RDD中同样也存在分区的概念&#xff0c;本质上都是为了提高并行度&#xff0c;从而提高执行的效率&#xff0c;那在 Spark 中的分区该怎么设置呢&#xff1f; 首先分区不是越多越好&#xff0c;太多意味…

[Android]Logcat调试

Android采用Log(android.util.log)工具打印日志&#xff0c;它将各类日志划分为五个等级。 Log.e 打印错误信息 Log.w 打印警告信息 Log.i 打印一般信息 Log.d 打印调试信息 Log.v 打印冗余信息 不同等级的日志信息&#xff0c;在日志栏中会以不同颜色和等级(E、W、…

(附源码)ssm医院挂号系统 毕业设计 250858

医院挂号系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对医院排队挂号等问…

深入理解 Python 描述符

学习 Python 这么久了&#xff0c;说起 Python 的优雅之处&#xff0c;能让我脱口而出的&#xff0c; Descriptor&#xff08;描述符&#xff09;特性可以排得上号。 描述符 是Python 语言独有的特性&#xff0c;它不仅在应用层使用&#xff0c;在语言语法糖的实现上也有使用到…

【java基础系列】16- Java中怎么处理异常?

Java的异常处理 1、异常的概念 概念&#xff1a;程序在运行过程中出现的不正常现象。出现异常不处理将终止程序运行。异常处理的必要性&#xff1a;任何程序都可以存在大量的未知问题、错误&#xff1b;如果不对这些问题进行正确处理&#xff0c;则可能导致程序的中断&#x…

[附源码]Python计算机毕业设计SSM开放性实验室网上预约管理(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

分布式和可再生系统建模(simulink)

目录 1 可再生/微电网概述 1.1 分布式和可再生系统建模和仿真 1.2 解决工作流程 1.3 能源管理系统监控设计 1.4 验证控件的测试网格规范和IEEE标准 1.5 部署算法和代码生成 1.6 网格集成研究控制器的实时测试 2 微电网案例 2.1 简介 2.2 在 Simulink 中实现微电网…

【JavaEE】初识操作系统,吃透进程

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01; &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:初始操作系统&#xff0c;进程的概念 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵…

关于AM437x Linux+qt开发笔记(2)

第一部分,触摸屏 命令 lsinput (有些系统不移植)查看系统input实践 命令ox -d /dev/input/event1 或hexdump -d /dev/input/event1 (从上图看,event0没有接的触屏) ,点击屏幕如下 命令 ls /dev/input -al , 查看input设备的触摸屏软连接。 命令cat /etc/udev/ru…

编码与测试

文章目录一、编码1、概念2、如何选择程序设计语言3、程序设计风格&#xff08;1&#xff09;源程序文档化(2) 数据说明&#xff08;3&#xff09;语句构造&#xff08;4&#xff09;输入输出&#xff08;5&#xff09;程序效率编码时提高程序运行效率的主要规则二、软件测试基础…

【爬坑之路一】windows系统下更新升级node版本【亲测有效】

前言 一定要看到最后&#xff01;&#xff01;&#xff01; 项目开发中&#xff0c;需要升级 node 版本。本着不想卸载 node 再重新安装的原则&#xff0c;因为node 的环境配置以及各种相关配置有些繁琐&#xff0c;所以就想着使用 命令的方式进行升级。 在网上找了一些升级 n…

C#详解:程序域、程序集、模块、Type、反射

总结&#xff1a; ">>>":代表包含 进程>>>应用程序域AppDomain>>>程序集Assembly>>>模块Module>>>类型Type>>>成员&#xff08;方法、属性等&#xff09; 1、程序集Assembly 如图&#xff0c;假设一个解决方…

ARM 自己动手安装交叉编译工具链

一、Windows中装软件的特点 Windows中装软件使用安装包&#xff0c;安装包解压后有2种情况&#xff1a; 一种是一个安装文件&#xff08;.exe .msi&#xff09;&#xff0c;双击进行安装&#xff0c;下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式&#xff0c;我们平…

(附源码)ssm招聘网站 毕业设计 250858

SSM招聘网站 摘 要 招聘网站采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员、用户、企业三部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、站点管理&#xff08;轮播图、公告栏&#xff09;用户管理&#xff08;管理员、应聘用户、企业用户…

重点| 系统集成项目管理工程师考前50个知识点(2)

本文章总结了系统集成项目管理工程师考试背记50个知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 11、项目目标包括成果性目标和约束性目标。项…

直播倒计时,PyTorch Conference 2022 今晚开启

内容一览&#xff1a;PyTorch Conference 2022 即将在美国南部城市新奥尔良举办。本次会议将带来技术讲座、项目演示及最佳案例分享。 本文首发自微信公众号&#xff1a;PyTorch 开发者社区 关键词&#xff1a;PyTorch 深度学习 机器学习 PyTorch Conference 2022 今晚开启 自…

360crawlergo结合xray被动扫描

360crawlergo结合xray被动扫描 360crawlergo结合xray被动扫描安装配置 360crawlergo结合xray被动扫描 安装 Xray https://github.com/chaitin/xraycrawlergo_x_XRAY https://github.com/timwhitez/crawlergo_x_XRAYcrawlergo https://github.com/0Kee-Team/crawlergo 更多的…

高等数值计算方法学习笔记第7章【非线性方程组求根】

高等数值计算方法学习笔记第7章【非线性方程组求根】一、方程求根与二分法&#xff08;第五次课&#xff09;二、不动点迭代法及其收敛性1.不动点迭代与不动点迭代法&#xff08;一个例题&#xff09;2.不动点的存在性与迭代法的收敛性&#xff08;两个定理&#xff0c;两例题&…