Scala入门
why is Scala?
1)Spark—新一代内存级大数据计算框架,是大数据的重要内容。
2)Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。【海量数据的采集,存储,计算分析【mapreduce,Spark】/ [java,python,scala主力]】
3)Scala 是 Scalable Language 的简写,是一门多范式(编程的方式[面向对象编程,函数式编程])的编程语言●
4)联邦理工学院洛桑(EPFL )的Martin Odersky于2001/2003推出 年开始设计Scala
5)Spark的兴起,带动Scala语言的发展!
Scala语言诞生小故事
创始人马丁·奥德斯基(Martin Odersky)是编译器及编程的*爱好者,长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)
Pizza和Scala极大地推动了Java编程语言的发展。[如何理解?]
jdk5.0 的泛型,for循环增强, 自动类型转换等,都是从Pizza 引入的新特性。
jdk8.0 的类型推断,Lambda表达式就是从scala引入的特性。
且现在主流JVM的javac编译器就是马丁·奥德斯基编写出来的。Jdk5.0 Jdk8.0的编译器就是马丁·奥德斯基写的,因此马丁·奥德斯基 一个人的战斗力抵得上一个Java开发团队。
Scala 和 Java 以及 jvm 的关系分析图
一般来说,学Scala的人,都会Java,而Scala
是基于Java的,因此我们需要将Scala和Java以及JVM 之间
的关系搞清楚,否则学习Scala你会蒙圈。
建议:如果没有任何Java基础的同学,先学Java,至少要
学习JavaSE,再学习Scala。
我们分析一下:Scala 和 Java 以及 jvm 的关系 (重要!)。
Scala语言的特点
Scala是一门以java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起
的静态类型编程语言。
1)Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程
2)Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。[案例演示]
3)scala 单作为一门语言来看, 非常的简洁高效 【三元运算符, ++ --】
4)Scala 在设计时,马丁·奥德斯基 是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基 也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学,只要在学习Scala的过程中,搞清楚Scala 和 java相同点和不同点,就可以快速的掌握Scala这门语言
快速有效掌握Scala的建议 [1. 学习sala独有的内容(语法,功能)2 搞清楚scala 和java的区别,3 如果正确的规范的使用scala] //ssm => ssh (hibernate mvc )
Scala快速开发入门
//对scala的基本的程序结构说明
//1. object 是一个关键字,表示一个伴生对象
//2. 如果该文件只出现了一个object HelloScala 就会在编译后两个.class文件
//3. 第一个文件是HelloScala.class 这个表示他的伴生类,但是空的.
//4. 第2个文件是HelloScala$.class 对应的是object HelloScala,但是本质是调用它对应的一个静态属性 MODULE$
//5. 这两个文件的关系和main函数的入口关系一会分析
object HelloScala {
// 1. def 表示一个方法或者一个函数
// 2. main 表示入口
// 3. args: Array[String] 表示形参,args 是形参名 Array[String] 是形参类型表示一个Array数组
// 4. :Unit 表示返回值类型为 Unit ,等价于java 的void
// 5. = 表示 后面写的是函数体/方法体, 它还有返回值类型推导的作用
def main(args: Array[String]):Unit = {
// 表示是 输出, 类似System.out.println("hello, scala世界!")
// 在scala 语句后,不需要带; //体现简洁
println("hello, scala世界!")
}
}
代码:
object HelloScala {
def main(args: Array[String]): Unit = {
println("hello,scala!")
}
}
Scala程序反编译
- 看反编译代码
- 模拟代码
//类
public final class HelloScala2
{
public static void main(String[] paramArrayOfString)
{
HelloScala2$.MODULE$.main(paramArrayOfString);
}
}
final class HelloScala2$
{
public static final HelloScala2$ MODULE$;
static
{
MODULE$ = new HelloScala2$();
}
public void main(String[] args)
{
System.out.println("hello,scala!~~~~~~ 模拟");
}
//private HelloScala$() { MODULE$ = this; }
}
- 为什么一个object A,对应两个class 文件
Scala执行流程分析
Scala语言输出的三种方式
- 字符串通过+号连接(类似java)。
- printf用法 (类似C语言)字符串通过 % 传值。(格式化输出)
- 字符串通过$引用(类似PHP)。
object InputDemo {
def main(args: Array[String]): Unit = {
val name:String = "tom"
val age:Int = 10
val sal:Double = 7890.144
//格式化输出
//sal=%.2f 保留小数点两位的方式输出(四舍五入)
printf("name=%s age=%d sal=%.2f\n", name, age, sal)
//字符串通过$引用(类似PHP)。
println(s"name=$name age=${age+1} sal=$sal sum2=${sum2(23,90)}")
}
//函数/方法
def sum2(n1:Int,n2:Int): Int = {
return n1 + n2
}
}