0、scala是Java语言脚本化(所以它的底层还是Java),它是面向函数编程
1、scala判断一个数据或者对象的类型只需要在该对象后面添加 .getClass.getSimpleName
2、显示找不到主类:make directory as source root
3、报错:object FloatRef does not have a member create。。
是因为pom文件中scala相关依赖没加进去,如
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>${scala.version}</version>
</dependency>
4、scala中,对于mymap = map(“ljy”, 100), value = mymap.get(“ljy”)等于Some(100), 此时不能进行value.toString().toLong,否则会报NumberFormatException的错误,应该value.getOrElse(0)
5、scala if语句简写:val age = if (name==“hxt”) 20 else 30
6、scala代码里面执行shell命令:
import scala.sys.process._
"ls -l"! //在结尾加!表示执行外部命令
val list = "ls -l" #| "grep P" ! //不能在命令表达式中直接用管道, 比如 "ls | grep XXX" 这样不灵,必须用 #| 声明。
7、字符串中的变量替换,Scala中基础的字符串插值就是在字符串前加字幕‘s’,然后在字符串中放入变量
var name = "zhangsan"
var age = 15
println(s"name=$name,age=$age")
8、var name:String = _ 等价于 var name:String=null
9、trait:特质,同时拥有抽象方法和具体方法,跟java中接口差不多,但是不能完全等同,因为接口不能有具体方法。而且某个类要是实现trait,用的是extends而不是implement
10、柯理化:两个参数的函数变成一个参数的函数,返回的是一个函数,该函数的参数是原来的第二个参数
原来 :def add(a:Int,b:Int) = a + b
柯理化后: def add(a:Int) = (b:Int)=>a+b //先传一个参数a,再传另一个参数b
也可以化简成 def add(a:Int)(b:Int) //类似这种多个参数的形式就是柯理化
11、Actor:和Java中的线程类似
1.定义Actor类
import scala.actors.Actor
class MyActor extends Actor{ //继承Actor类
def act{ //实现act方法
while(true){
receive{ //不断接收信息。所以如果没有消息来的话,就会阻塞
case "hi" => println("hello")
}
}
}
}
给MyActor发送消息:MyActor ! hi (消息可以是发给自己,也可以是发给别人。在receive里面引入另一个actor的引用,就是发给别人)
2.创建Actor对象。并让它运行
val act = new MyActor
act.start()
12、=> 匿名函数(Anonymous Functions),表示创建一个函数实例。
比如:(x: Int) => x + 1 整个表达式就是一个匿名函数,和如下JAVA方法表示的含义一样:
public int function(int x){
return x+1;
}
13、java和scala的区别和联系
- 1)scala底层用到的还是java,只是在java上套了一层壳,由于scala最终被编译为.class,所以其实本质上还是java, 在scala中可以任意的调用java的api
.java –> .class –> jvm
.scala –> .class –> jvm - 2)函数式编程:主要思想是把运算过程尽量写成一系列嵌套的函数调用。比如spark的rdd.map(x…),整个代码都在map整个函数里面
- 3)scala是弱类型语言,只有var和val。scala的可以用option代替空值,而java是null,要加判断否则会空指针
- 4)scala中没有static,但是可以用object来达到java中相同的效果,scala中的object可以实现单例对象