Scala语言学习

本文详细介绍了Scala语言的学习流程,包括其在大数据技术生态中的地位、语言特点和快速掌握的建议。深入讲解了Scala的语法特性,如变量、数据类型、函数式编程、面向对象特性、异常处理、集合操作以及隐式转换。此外,文章还涵盖了函数的使用、递归调用、高阶函数、特质和数据结构等内容,旨在帮助读者全面理解并熟练运用Scala。
摘要由CSDN通过智能技术生成

Scala语言

引言:其实代码没有你想象那么难,但是如果你想不到哪里去,就会很难.

学习一个技术或知识点的流程:

在这里插入图片描述

大数据技术生态体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ownYYT31-1569808582030)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1569243931445.png)]

学习Scala的原因:

​ 1)Spara新一代内存级大数据框架,是大数据的重要内容。

​ 2)Spark就是使用Scala编写的,因此为了更好的学习Spark,需要掌握Scala这门语言。

​ 3)Scala是Scalable Language的简写,是一门多范式的编程语言。

​ 4)Spark的兴起,带动了Scala语言的发展。

官网:Scala-lang.org

​ Scala和Java以及jvm的关系分析图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zwGWbcCU-1569808582033)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1569117607635.png)]

Scala语言的特点:

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。

1)Scala是一门多范式(multi-paradigm)的语言,Scala支持**面向对象和函数式编程(是一个值) ** 表达能力强,代码精简 最优雅

2)Scala源代码(Scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接

3)Scala但作为一门语言来说,非常的简洁高效(三元运算符,++,–)

快速有效的掌握Scala的建议:

1】学习Scala语法特有的特性

2】搞清楚Scala和Java的区别

3】如何让规范使用Scala

写第一个Scala语言

//说明
//1.object表示以一个伴生对象,这里我们可以简单的理解就是一个对象
//2.Hello Scala就是对象的名字,他的底层真正对应的类名是Hello Scala$,
//  对象是Hello Scala$ 类型的一个静态对象MODULE$
//3.
object HelloScala{//名字
    //前:形参名字   后:形参类型   泛型表示:[String]   Unit:相当于Java的void   
	def main(args:Array[String]):Unit={//主方法
		println("hello,scala!~~")   //输出:println()
	}

}

在IDEA上面开发

第一步创建一个Maven工程等等
在IDEA上创建基于maven工程的Scala项目(创建项目的方式有很多,自己要掌握几套熟练的)
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在maven工程里面下载mysql的依赖包jar

	//注意版本要配套
//去官网查找maven里的mysql依赖包版本。
	<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.45</version>
    </dependency>

在这里插入图片描述在这里插入图片描述
纵览项目结构
在这里插入图片描述
查看项目的默认路径
在这里插入图片描述在这里插入图片描述

高阶函数要熟练掌握

scala> def xxx(x:Array[String])={
     | val fids = x(1).split(" ")
     | val odn = x(2).split(" ")
     | for(j <- 0 until fids.length){
     |   
     
     scala> xx.
!=                compareTo             genericBuilder        matches               runWith         toBuffer
##                compareToIgnoreCase   getBytes              max                   sameElements    toByte
*                 compose               getChars              maxBy                 scan            toCharArray
+                 concat                getClass              min                   scanLeft        toDouble
++                contains              groupBy               minBy                 scanRight       toFloat
++:               containsSlice         grouped               mkString              segmentLength   toIndexedSeq
+:                contentEquals         hasDefiniteSize       ne                    self            toInt
->                copyToArray           hashCode              nonEmpty              seq             toIterable
/:                copyToBuffer          head                  notify                size            toIterator
:+                corresponds           headOption            notifyAll             slice           toList
:\                count                 indexOf               offsetByCodePoints    sliding         toLong
<                 diff                  indexOfSlice          orElse                sortBy          toLowerCase
<=                distinct              indexWhere            padTo                 sortWith        toMap
==                drop                  indices               par                   sorted          toSeq
>                 dropRight             init                  partition             span            toSet
>=                dropWhile             inits                 patch                 split           toShort
addString         endsWith              intern                permutations          splitAt         toStream
aggregate         ensuring              intersect             prefixLength          startsWith      toString
andThen           eq                    isDefinedAt           product               stringPrefix    toTraversable
apply             equals                isEmpty               r                     stripLineEnd    toUpperCase
applyOrElse       equalsIgnoreCase      isInstanceOf          reduce                stripMargin     toVector
asInstanceOf      exists                isTraversableAgain    reduceLeft            stripPrefix     transpose
canEqual          filter                iterator              reduceLeftOption      stripSuffix     trim
capitalize        filterNot             last                  reduceOption          subSequence     union
charAt            find                  lastIndexOf           reduceRight           substring       unzip
chars             flatMap               lastIndexOfSlice      reduceRightOption     sum             unzip3
codePointAt       flatten               lastIndexWhere        regionMatches         synchronized    updated
codePointBefore   fold                  lastOption            replace               tail            view
codePointCount    foldLeft              length                replaceAll            tails           wait
codePoints        foldRight             lengthCompare         replaceAllLiterally   take            withFilter
collect           forall                lift                  replaceFirst          takeRight       zip
collectFirst      foreach               lines                 repr                  takeWhile       zipAll
combinations      format                linesIterator         reverse               to              zipWithIndex
companion         formatLocal           linesWithSeparators   reverseIterator       toArray         →
compare           formatted             map                   reverseMap            toBoolean

scala> xx.

//只要以后看到有object TestScala ,你应该有这样一个认识
//1.object TestScala对应的是一个Test Scala$的一个静态对象 MODULE$
//2.在我们的程序中,是一个单例模式

object TestScala {
  def main(args: Array[String]): Unit = {
    println("hello,sca;a,idea...")
    var num1:Int = 10
    var num2:Int = 20
    println(num1+num2)

    println("名字\t年龄\t邮件\t性别")
  }
}
Scala执行流程分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BI0IB7vA-1569808582044)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1569160726927.png)]

Scala程序开发注意事项(重点)

1)Scala源文件以“.Scala”为扩展名

2)Scala程序的执行入口时main()函数

3)Scala语言严格区分大小写、

4)Scala方法由一条一条语句构成,每一个语句后不需要分号(Scala语言会在每行后自动加分号),这也体现了Scala的简洁性。

5)如果在同一行有多条语句,除了最后一条不需要分号,其他语句都需要加分号。

Scala语言转义字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h91IYegF-1569808582045)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1569161422389.png)]

Scala语言输出的三种方式

1)字符串通过+号连接(类似java)

2)printf用法(类似C语言)字符串通过%传值

3)字符串通过$引用(类似PHP)

代码如下

//案例
object printDemo {
  def main(args: Array[String]): Unit = {
    var str1:String = "hello"
    var str2:String = "world"
    //连接起来输出
    println(str1 + str2)
    var name:String = "tom"
    var age:Int = 10
    var sal:Float = 10.67f
    var height:Double = 180.15
    //格式化输出
    //保留小数点后面两位三位%.2f   $%.3f   输出的值要一一对应
    println("名字=%s 年龄是%d 薪水%.2f 身高%.3f",name,age,sal,height)

    //Scala支持使用$输出内容,编译器会去解析$对应变量
    println(s"个人信息如下:\n 名字$name \n年龄$age \n薪水$sal")
    //如果在字符串中出现了类似${age + 10}则表示{}是一个表达式
    println(s"个人信息如下:\n 名字${name} \n年龄${age + 10} \n薪水${sal*100}")
  }
}
Scala源码的查看的关联

​ 使用Scala过程中,为了搞清楚底层代码的机制,需要查看源码,

​ 1)查看源码,选择要查看的方法或者类,输入CTRL+b

​ 2)关联源码,步骤 1:将我们的源码包拷贝到 scala/lib 文件夹下. scala-sources-2.12.4

​ 步骤 2: 关联即可,选中这个文件夹,进行关联, 最后,可 以看到源码

注释(comment)

​ 注释提高了代码的阅读性,注释是一个程序员必须具有的良好的编程习惯

​ 注释类型:单行注释 多行注释 文档注释

正确的代码风格

正确的缩进和空白

  1. 使用一次 tab 操作,实现缩进,默认整体向右边移动,时候用 shift+tab 整体向左移

  2. 或者使用 ctrl + alt + L 来进行格式化 [演示]

  3. 运算符两边习惯性各加一个空格。比如:2 + 4 * 5。

  4. 一行最长不超过 80 个字符,超过的请使用换行展示,尽量保持格式优雅

编程最难的两点:(1)业务逻辑(2)性能优化(实现那些性能)

Scala变量的基本使用
object VarDemo01 {
  def main(args: Array[String]): Unit = {
  var age: Int = 10
  var sal: Double = 10.9
  var name:String = "tom"
  var isPass:Boolean = true
  //在Scala中,小数默认为Double,整数默认为Int
  var score:Float = 70.9f
  println(s"${age} ${isPass}")
  }
}
Scala变量声明基本语法

变量声明的基本语法

var|val 变量名 [: 变量类型] = 变量值

var 是可以改变值的 val是不可以改变值(常量值)的,没有线程安全问题,效率高(推荐使用) 两者有一定的区别

Var修饰的对象可以改变,val修饰的则不可以改便,但是对象的状态(值)却是可以改变的(比如L自定义对象,数组,集合等等)

变量声明时,需要初始值。

Scala数据类型介绍

Scala与Java有着相同的数据类型,在Scala中数据的类型都是对象,也就是说Scala没有Java中的原生类型。

Scala数据类型分为两大类AnyRef(值类型)和AnyRef(引用类型),注意,不管是AnyVal还是AnyRef都是对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NU3gTty0-1569808582047)(C:\Users\tt\AppData\Roaming\Typora\typora-user-images\1569207055793.png)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值