问题集锦
01
正文
01scala与spark
scala是spark内核的实现语言,版本对应是这样的spark1.6 对应 scala 2.10实际上scala的更高版本也是可以的。spark1.6需要运行在java1.7上,python2.6上。java1.6到java1.7增添了maven包管理器,java1.7到java1.8增加了lamda表达式。
02 scala与java
scala也是基于jvm的,需要编译为字节码 .class文件,然后运行在jvm上。
scala既是面向对象又是面向函数的(对象和函数都可以被作为参数进行传递)。函数即java中的方法,在java1.8中也可以面向函数(匿名内部类)。
03 官网scala-long.org关于scala六大特性的说明。
第一个特性,由于scala和java都是基于JVM的,scala和java无缝整合,可以互相调用类。但是不可以同时混用两种语言。
第二个特性,类型推断,很想JavaScript,只有两种变量var和val var是用来定义变量,val是用来定义常量。其中val用的更多,因为jvm的回收机制gc可以把不常用的val变量回收。所以尽可能的定义val变量,如果是变量不需要显式定义,因为scala可以类型推断。
第三个特性,分布式和并发性。scala中有actor这种通信模型类似thread,可以支持在多台机器上的单进程多线程的通信。
第四个特性,traits结合了java中的抽象类和接口的特点。既可以多继承也可以多实现。方法也可以有方法体,变量也可以定义。
第五个特性,模式匹配,类似于switch
第六个特性, 高阶函数 就是可以将函数作为参数传递给函数。scala中函数和方法的区别很小。
04 环境配置和创建初级项目
略 项目的创建步骤如下:选择创建新项目,选择scala ,选择scala的sdk 就可以了。
05 数据类型的描述
基本数据类型是靠类型推断,不需要进行显式定义。以下主要介绍scala与java不同的地方。
unit 这个代表无和void很像,比如作为函数的返回值
nothing这个数据类型是所有类型的子类,当scala推断不出来变量的类型的时候它就用nothing来代替。是类型推断的辅助,不可以new nothing。
any 所有类型的父类,所有的实例都是any类型,理论上基于jvm的语言都有一个所有类型的父类,object,实际上object也是any的父类。
anyRef 所有引用类型的父类。
anyvar 所有值类型的父类,比如double ,1000.
None 是option的子类之一,代表没有值,比如map中通过关键字a找到的对应的值是没有值,则返回None。用于函数的安全返回值。
Nil 长度为0的List。
05 创建一个一般的scala工程
步骤 创建一个新的工程,选择scala,然后选择idea,然后点击完成。
new一个包 new一个Object (在idea中new 一个object的方法详见这片博客https://blog.csdn.net/wi8ruk48/article/details/88666660)。
当然也可以new一个scala.class文件。
06 基本的scala练习:
package com.bjsxt.scala
import java.util.Date
/**
* 问题集锦
* 1.Person类中的showname方法的定义中为何有一个等于号。def showname()={} main方法中也有,而this方法中没有
* 解释 : * 知识点9.定义方法的“=”可以省略,如果省略了“=”,那么最后一行的执行结果将会被丢弃,返回unit
*2.到底在何种情况下使用var 函数的返回值也用val接收,这样合理吗
*/
/**
* 以下几点都与java有所不同。
* 1.在scala的object中定义的变量和方法都是静态的。object不可以传递参数,trait也不可以传递参数。object 不需要用new,直接用名字.成员即可。
* 2.scala有分号推断机制
* 3.给函数或者类定义参数需要指定类型。
* 重点: 4.类中默认含有有参数的构造方法,但是这个默认的构造方法和java不同,它的参数和类的参数相同,定义一个实例时就会调用类中默认的构造方法。类中的属性默认就有getter,setter方法。
* 5.new 一个对象的时候除了一般方法不执行外,其他的都执行。
* 6.静态的object先加载。
* 7.scala中如果一个类的名称和object的名称相同,那么称这个类为这个object的伴随类,这个object为这个类的伴随对象,他们之间可以互访私有变量。同一个包中不能含有同名的类。
* 8.如果方法体的最后一行的计算结果当做返回值返回,那么return可以省略,如果return不省略,那么方法的返回值类型不可以省略。
* 9.定义方法的“=”可以省略,如果省略了“=”,那么最后一行的执行结果将会被丢弃,返回unit
*/
class Person(Xname:String,Xage:Int){
val name = Xname
var age = Xage
var gender = 'm'
println("************")
/**
* 重写构造
*/
def this(Yname:String,Yage:Int,Ygender:Char){
this(Yname,Yage);
this.gender = Ygender;
}
def showHello()={
println("helloworld"+" "+Lesson_ObjAndClass.score)
}
}
object Lesson_ObjAndClass {
println("==========")
val score = 200
def main(args: Array[String]): Unit = {
/* val person = new Person("zhangsan",18)
person.age = 18
println(person.gender)
val p1 = new Person("diaochan",20,'f');
println(p1.gender)
p1.showHello()
*/
/**
* scala中的for循环
* 1 to 10 这种写法是scala中的操作符操作
*/
println(1 to 10)//包括10
println(1 until 10)//不包括10
println(1 to (10,2))
println(1 to (10,3))
println(1 to (20,5))
for(i <- 1 to 10){ //这里的<-的意思是赋值给i
println(i)
}
for(i<-1 to 10){
for(j <- 1 to 10){
println("i = " + i+" " + "j = " + j)
}
}
for(i <- 1 to 10;j <- 1 to 10){//这是双重循环的另外一种写法。
println("i = " + i +" " + "j = " + j)
}
val list1 = for(i <- 1 to 100 if(i%100==0)) yield i//这里用yield关键字的作用是把符合结果的值放进集合中,这个集合的名字是list1,具体类型是vector
list1.foreach(x=>{ // 这里的foreach相当于加强for循环,而=>则相当于lamda表达式,而{}则相当于匿名函数。x 在这里相当于把集合list1中的每个元素取出来赋值给x,然后把x赋值给匿名函数。
println(x)
})
list1.foreach(println(_))//如果list1中的值只需要出现一次(如果方法体可以用一行搞定,那么可以用下划线来代替),那么可以用下划线来代替
}
}