Scala--第二天

一、Scala中有方法和函数俩种技术

  1.方法

     定义:def 方法名(参数名:参数类型,参数名:参数类型):[返回值类型] = {

          方法体

        }

     e.g:

 1     def test1(): Unit = {
 2       println("我是一个方法")
 3     }
 4     //return需要同返回值类型一起使用,不可独立存在
 5     def test2(x: Int, y: Int): Int = {
 6       return x + y
 7     }
 8     //返回值类型可以省略 ,Scala会根据方法体的最后一行内容进行类型推导
 9     def test3(x: Int, y: Int) = {
10       x + y
11     }
12     //方法中没有参数的话,在调用方法的时候,可以省略()
13     test1
14     var a = test2(1, 2)
15     println(a)
16     print(test3(1, 5))
17     //    我是一个方法
18     //    3
19     //    6

    方法的注意事项:

  •       方法的返回值类型可以不写,Scala会根据方法体的最后一行做类型推导
  •       return和返回值类型,同生共死
  •       方法中有递归操作时,返回值的类型必须指定,不可以省略,负责报错
1   def foop(x:Int):Int={
2     if (x<=1){
3       return 1
4     }
5     return x*foop(x-1)
6   }
7     print(foop(3))
8 //    6

    方法的参数种类

    1.默认参数

1     def test1(x: Int = 0):Int = {
2       return x
3     }
4     //这个括号不可省略,即使参数有默认值,但是方法依然有参数
5     println(test1())
6     println(test1(3))
7 ###结果
8 0
9 3

    2.带名参数

1     def test2(x:Int=1,y:Int=2):Int={
2       return x+y
3     }
4     println(test2(x=3))
5     println(test2(x=3,y=3))
6 ###结果
7 5
8 6

    3.变长参数:当一个方法的参数不可定,可以把其参数定义为变长参数

 1     def test3(x: Int, num: Int*): Int = {
 2       //查看num的类型
 3       println(num.getClass)
 4      //使用数组的方法sum求和
 5       return num.sum + x
 6     }
 7
 8     println(test3(1, 2, 3, 4))
 9
10 ###即使有默认参数,Scala依然会给其分配一个值,以防止变长参数收集参数的错误
11     def test4(y: Int = 1, num: Int*) = {
12       num
13     }
14
15     println(test4(2, 3, 4))
16   }
17 ###结果
18 class scala.collection.mutable.WrappedArray$ofInt
19 10
20 WrappedArray(3, 4)         

    方法的调用

    1.后缀调用

    2.中缀调用

    3.花括号调用

    4.无括号调用

 1     //后缀调用
 2     var a = Math.abs(-1)
 3     println(a)
 4     //中缀调用 多个参数的话可以用()括起来
 5     var b=Math abs -1
 6     println(b)
 7 ###结果
 8 1
 9 1
10     //to方法也是
11     println(1 to 10)
12     println(1.to(10))
13 ###结果
14 Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
15 Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
16     //花括号调用 语句块中的返回值即为参数,必须是一个
17     var c=Math.abs{
18       println("我是第三种方式")
19       -1
20     }
21     println(c)
22 ###结果
23 我是第三种方式
24 1
25     //无括号调用,方法中没有参数,前面的数组求和就是,这里不举例

  2.函数

  Scala支持函数式编程,spark等大数据框架有很多的函数式编程

  定义:

    val 函数名 = (参数名:参数类型,...) =>{

      函数体

    }

 1     val fun1 = (x: Int, y: Int) => {
 2       x + y
 3     }
 4     println(fun1(1, 2))
 5     val fun2 = () => println("无参形式")
 6     fun2()
 7   }
 8 ###结果
 9 3
10 无参形式

  函数的特点

  •   函数本身是一个独立的对象
  •   类似于方法有返回值,有参数
  •   定义函数时,不用def关键字
  •   无需指定返回值类型,也就不可以用return

  3.方法与函数的区别

  1.   方法是面向对象的概念,隶属于对象或类,不独立存在
  2.   函数本身就是一个对象,继承自Function 的父类,有其apply,tuple等方法

  4.方法转换为函数

1     def test1(x: Int): String = {
2       return s"我是一个方法${x}"
3     }
4     //方法转函数 格式  在方法的后面+一个空格+_
5     var a = test1 _
6     var b = a(2)
7     println(b)
8 ###结果
9 我是一个方法2

  注意:方法可以转换成一个函数,但是函数不可以转换成一个方法 ,因为函数本身就是一个对象 

二、数组

  1.定义:是一个可以存储相同数据类型的容器

  2.分类:①定长数组:开辟的内存空间不可变;存储的内容可变

      ②变长数组:数组的长度可变,可以对数组进行添加和删除空间操作

  3.定长数组

 1     //方式一 比较常用
 2     var a=Array(1,2,3)
 3     //用数组名(index)方式方位数组的元素,也可以赋值
 4     a(0)=2
 5     println(a.toBuffer)
 6 ###结果
 7     //    ArrayBuffer(2, 2, 3)
 8     //方式二 带new关键字
 9     var b=new Array[Int](4)
10     b(0)=2
11     //查看数组元素,与数组长度
12     println(b.toBuffer)
13     println(b.length)
14     //不带new关键字
15     var c= Array[Int](4)
16     c(0)=2
17     println(c.toBuffer)
18     println(c.length)
19 ###结果
20 //    ArrayBuffer(2, 0, 0, 0)
21 //    4
22 //    ArrayBuffer(2)
23 //    1

  4.变长数组

 1   //方式一:这种方法只能创建一个初始长度为0的可变长数组 后续通过 += 操作可以进行追加
 2   var a=ArrayBuffer[Int]()
 3     a+=1
 4     a+=1
 5     a+=1
 6     println(a.length)
 7     println(a.toBuffer)、
 8 ###结果
 9 3
10 ArrayBuffer(1, 1, 1)
11
12   //方式二:简单,而且常用,依旧使用 += 进行追加
13   var b=ArrayBuffer(1,2,3)
14     b+=4
15     println(b.length)
16     println(b.toBuffer)
17 ###结果
18 4
19 ArrayBuffer(1, 2, 3, 4)

  数组的操作

  •   使用 += 添加元素 在数组末尾添加
  •   使用 -= 删除元素 等号后面跟的是要删除的元素
  •   使用 ++= 追加一个数组(定长或变长均可)到一个变长数组,只有变长数组才有这个操作
1  var b=ArrayBuffer(1,2,3)
2     b+=4
3     var a =Array(1,2,3)
4     var c = b++=a
5     println(c.toBuffer)
6 ###结果
7 ArrayBuffer(1, 2, 3, 4, 1, 2, 3)

  数组的遍历

 1     var b=ArrayBuffer(1,2,3)
 2     b+=4
 3     //方式一:for遍历
 4     for (i<-b)println(i)
 5     println("-------------")
 6     //方式二:使用下标遍历
 7     for(i<- 0 until b.length)println(b(i))
 8 ###结果
 9 1
10 2
11 3
12 4
13 -------------
14 1
15 2
16 3
17 4

  数组的一些相关操作

 1 数组的拷贝
 2      var a = Array(1, 2, 3, 4)
 3     //b是一个空的数组
 4     var b = new Array[Int](3)
 5     //参数一 目标数组,参数二 目标数组开始索引,参数三 原数组 的copy个数
 6     a.copyToArray(b, 0, 3)
 7     for (i <- b) println(i)
 8 ###结果
 9     //    1
10     //    2
11     //    3
 1     //将数组变成字符串
 2     var a = Array(1, 2, 3, 4)
 3     //使用"-"符号进行拼接
 4     var b = a.mkString("-")
 5     println(b)
 6 //    1-2-3-4
 7     //数组怕排序,默认升序,可以在进行反转得到降序结果
 8     var c =Array(5,4,8,6)
 9     var d=c.sorted
10     println(d.toBuffer)
11 //    ArrayBuffer(4, 5, 6, 8)
12     println(d.reverse.toBuffer)
13 //    ArrayBuffer(8, 6, 5, 4)

  其他常见的方法

  • 数组的长度
  • a.length
  • 数组内容求和
  • a.sum
  • 数组的最大值
  • a.max
  • 数组的最小值
  • a.min
  • 第一个数据
  • a.head
  • 除掉第一个元素后面的数据
  • a.tial

三、元组

  1.三要素

  •     Scala 中的元组数据不要求同类型
  •     元组的数据内容,不可变
  •     Scala元组的个数是22个

  2.定义格式

 1     //方式一:简单常用 格式:var/val 元组 = (元素1,元素2,元素3)//最多能够容纳22元素
 2     var a = (1, "sss", 3)
 3     println(a.getClass)
 4     println(a)
 5     //class scala.Tuple3
 6     //(1,sss,3)
 7     //方式二:var/val 元组 = 元素1 -> 元素2 这种定义方式 元组中 只能有2个元素
 8     var b = 1 -> 2->3
 9     println(b)
10     //((1,2),3)

  3.下标访问

1     //下标访问元组 元组的索引用 1 开始
2     var a = (1, "sss", 3)
3     println(a._1)
4     println(a._2)
5     //1
6     //sss

  

  

  

原文地址:https://www.cnblogs.com/cmxbky1314/p/12263393.html

时间: 2024-11-02 22:34:33

Scala--第二天的相关文章

Scala第二章学习笔记

最基本的练习~: 使用伴生对象: object holder{ class Foo{ private var x = 5} object Foo{def im_in_yr_foo(f: Foo) = f.x} } import holder.Foo val x = new Foo Foo.im_in_yr_foo(x) 基本的会话: Scala的if块是个表达式.在Java中,达到类似的目的就是这种代码: String x = true ? "true string" : "

快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)

apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值就是跟在if或else之后的表达式的值,如果两者类型不同,选择各分支类型的公共超类型作为返回类型. if(x>1) 1 相当于 if(x>1) 1 else () 你可以把()当做是表示"无有用值"的占位符,将Unit当做Java的Void 如果你在写较长的语句,需要分行来写的

快学Scala 第二十一课 (初始化trait的抽象字段)

初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println("Logged")} } trait FileLogger extends Logged { var filename: String override def log(msg: String) { println("filename:" + filename) } }

快学Scala 第二十二课 (apply和unapply)

apply和unapply: apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new. unapply是当做是伴生对象的apply方法的反向操作.apply方法接受构造参数,然后将他们变成对象.而unapply方法接受一个对象,然后从中提取值.unapply方法返回的是一个Option. object ScalaRunner { def main(args: Array[String]): Unit = { testApply2() testApplyUnApply() testC

从大数据菜鸟走上大师的历程 第二讲:函数定义,流程控制,异常处理

Scala 第二讲 函数定义,流程控制,异常处理 For 循环  for(左边为单个对象obj  <-  右边为对象集合objs ) for 循环里把右边的对象赋给左边 现在正是学习大数据的最好机遇,不花一分钱就可以成为大数据高手,实现年薪50万的梦想. 王家林的第一个中国梦:免费为全社会培养100万名优秀的大数据从业人员! 如果您有兴趣请点击这个链接进入大数据的学习 http://blog.sina.com.cn/s/blog_8fbd39ee0102vto3.html 如果您确实感觉视频教程

探索Scala(4)-- Case Classes

本文简单探讨一下Scala语言Case Class的实现机制 Case Class Case Class是Scala语言模式匹配功能的基础.如果定义类的时候加上case关键字,那么它就变成了Case Class,比如下面这个简单的类CC: case class CC(x: Int, y: Int) 那么加上case关键字对于一个类来说,到底意味着什么呢?下文将进行详细的解释. 单例对象 编译CC,会产生两个class:CC.class和CC$.class.这说明,Scala会给case类自动添加

scala 常用语法

Clojure首先是FP, 但是由于基于JVM, 所以不得已需要做出一些妥协, 包含一些OO的编程方式Scala首先是OO, Java语法过于冗余, 一种比较平庸的语言, Scala首先做的是简化, 以更为简洁的方式来编写OO, 主要利用‘type inference’能推断出来的, 你就不用写, 但如果仅仅这样, 不如用python所以Scala象其名字一样, “可伸展的语言”, 它是个大的集市, 它积极吸纳其他语言的优秀的特征, 最重要的就是FP, 你可以使用Scala来写OO, 但它推荐使

Spark全面精讲视频_Spark2.0视频

Spark全面精讲(基于Spark2版本+含Spark调优+超多案例) 课程观看地址:http://www.xuetuwuyou.com/course/149 课程出自学途无忧网:http://www.xuetuwuyou.com/ 课程分五个阶段,共115课时! 第一阶段 Spark内核深度剖析 第00节课-课程特色和学习方式 第一节课-Spark概述(四大特性) 第二节课-Spark入门 第三节课-什么是RDD? 第四节课-spark架构 第五节课-linux环境准备(虚拟机,linux)

Gradle 1.12用户指南翻译——第二十五章. Scala 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

王家林亲传《DT大数据梦工厂》第二讲Scala函数定义、流程控制、异常处理入门

你想了解大数据,你想成为年薪百万吗?那你还等着什么,快点来吧!跟着王家林老师学习spark大数据 第二讲主要讲了Scala函数定义.流程控制.异常处理入门 函数定义: 关键字(def) 函数名称 参数(参数名称:参数类型):返回内容类型  =  { 函数体 } 注意: Unit:空的返回内容 Scala结束语是不需要写分号 下面一代码为例: //不带参数 Object  ScalaBasics{ def doWhile(){ var line = “” do{ line = readLine()