java to scala 使用笔记

scala 也编译生成jvm的class来运行


变量:类型 = 值
var 可变 val 不可变。


#循环
xxoo.foreach(arg =>println(arg))


操作符没有重载
1+2实际是Int对象1调用方法,并将2作为参数传入


为什么scala数组取值用"()"而不是“[]”?
array[i] 会转换成 array.apply(i)进行方法调用。
array[i] = "abc" 会转换成 array.update(i,"abc")


数组的声明:记得用"()"
val xxoo = Array("wo","shi","hui")


操作符如*是右边作为参数,以“:”结尾则左边作为参数如"::"(List连接符,连接在List之前)
val onetwothree = List(1,2,3) //List类似String为不可变对象


为什么不支持append?
开销越来越大。


默认修饰符public


方法参数全是val而不是var
方法最后一行的结果可直接作为return


add(b : Int):Unit = sum +=b  可以写成 add(b : Int){sum += b}
Scala可以把任何值转化为Unit,并return后丢弃。


scala不能定义静态成员,取而代之singleton object,当单例对象与class对象同名时称为伴生对象,且必须在同一源文件下
object与class可以互相访问私有成员。object无参并在第一次访问下初始化


不与伴生类共享名称的为standalone object(例如应用入口)


object extends Scala.App相当于应用入口


几乎所有的Scala的控制结构都会产生某个值,这是函数式语言所采用的方式,程序被看作是计算值的活动。


scala的try-cathc语句,如果finally子句包含了返回语句,或抛出一个异常,这个返回值式异常将“凌驾”于任何
之前在try代码块或某个catch子句里产生的值或异常之上如:
    def f() :Int = try{1}finally{2} //返回1
    def g() :Int = try{return 1}finally{return 2} //返回2

scala的match语句:与java的switch比,1)任何类型的常量都能当case 2)隐含break!


不再使用break和continue


Scala中的yield的主要作用是记住每次迭代中的有关值,并逐一存入到一个数组中


占位符:"_"代表一个或多个参数, eg:  var fun2 = (_:Int) + 4
替代整个函数列表
def sum (x :Int,y:Int,z:Int) = x + y + z 
    var f1 = sum _  //f1指向函数值对象,自动产生一个类实例
    println(f1(1,2,3))

def f(arg:String*) 相当于java里 f(String... str)


减少代码重复
def fileMatching(matcher :String => Boolean) = matcher("xx")
def fileEnding(query:String) = fileMatching(_.endsWith(query))


高阶循环架构
def containOdd(x : List[Int]) = x.exists (_%2==1)
val list = List(1,2,3)
println(containOdd(list))
println(list.exists ( _ ==4 ));println(list.exists { x => x==4 });


//新的控制结构
def twice(op:Int =>Int,x:Int) =op(op(x))//执行两次
println(twice(_*2 ,2))


//传名参数
def byNameFun(predict => Boolean) = {……}
useage: byNameFun(5>3)


java定义了四个命名空间(字段、方法、类型、包),Scala只有两个(字段与类型),所以scala可以用val重写无参方法。


脆基类:你添加的新方法可能影响其他子类添加的重名的方法。
Scala会检测override修饰符,如无,会在编译报错


Any是所有类的超类,Nothing是所有类的子类


==在基础类型是自然的(数学布尔),对象上属于equal的别名。意味着可以用==比较两个字符串(如String:"eq"方法继承自Object,"equals"继承自java.lang.String)


Null是ValRef子类,不兼容值类型
def error():Nothing = throw new Exception("") //Nothing可以用来表明不正常的终止


protected比java更严格,只能在该类的子类中调用 


Class C 与 ClassC{}相同
样本类:类前加case修饰符,会添加与类名一致的工厂方法,即可以用Var('x')来替代 new Var('x'), tips:嵌套时特别有用!

猜你喜欢

转载自blog.csdn.net/lylhjh/article/details/60866523
今日推荐