类方法、if、while、for
package per.xxl /** * @author Administrator */ class HelloScala { } //object声明类,表示此类为单例,在第一次调用的时候初始化 //类中的方法都是静态方法 object HelloScala{ def hello(name:String):String={ "hello "+name } //无参方法可以去掉(),如果没()则调用时不能有() def helloScala(){ println("hello scala ,this is rocky!") } //默认参数 def helloDefault(s:String="addd"){ println("hello "+s) } //匿名函数 def add=(x:Int,y:Int)=>x+y //函数编程的柯里化 def add2(x:Int)(y:Int)=x+y //函数赋给常量 var sum=(x:Int,y:Int)=>x+y //可变参数 def varliableParameters(s:String*)={ s.foreach ( x => println(x) ) } def main(args:Array[String]){ println("hello Scala") println(hello("scala1")) helloScala //隐藏() helloScala helloDefault() //定义函数和表达式 println (add(1,2)) println (add2(1)(2)) println (sum(1,2)) varliableParameters("aa","bb","cc","123") //if println("if:"+(if(1>0)1 else 0)) //while var (n,r)=(10,0) while(n>0){ r=r+n n-=1 } println("while :"+r) //for for(i<- 1 to 10){ println("for:"+i) } //until 到10不再执行 for(i<- 1 until 10){ println("for until:"+i) } for(i<- 1 to 10 if i%2==0){ println("for if:"+i) } } }
OOP、继承与构造
package per.xxl /** * @author Administrator */ class OOPInScala { } class Person{ //属性声明 var可以get,set val只有get相当于java的final属性 var name:String =_ val age=27 private[this] val gender="male" } //1,主构造器直接跟在类名后面,主构造器中的参数会被编译成类的字段; //2,主构造器执行的时候会执行类中的所有不包含在方法体中的语句; class Person1(val name:String,val age:Int){ println("this is p1 construct ") } //如果在 主构造器函数的参数中没有用val或者var去声明变量, //那此时的变量是private[this]级别的,只能够被类内部访问 class Person2(name:String,val age:Int){ println("this is p2 construct ") } class Person3(val name:String,val age:Int){ println("this is p3 construct ") var gender:String =_ val unit:String="PU" //1, 附属构造器是用this来声明的; //2, 附属构造器中必须调用主构造或者其它附属构造器; def this(name:String,age:Int,gender:String){ this(name,age) this.gender=gender } } //继承,重写的方法或属性字必须加上override class Students(name:String,age:Int,majoy:String) extends Person3(name,age){ println("this is student construct ") //重写属性,var易变属性不能被重写,因为不需要,可以直接进行操作 //override var gender="female" override val unit="AU" //override def toString = "override to String" /*override def toString():String={ //使用return 必须在方法后面指定返回类型 return "override to String" }*/ override def toString()={ //不声明方法的返回类型,则默认最后一个表达式为返回值 "override to String" } } object OOPInScala{ def main(args:Array[String]){ val p = new Person p.name="Rocky" println(p.name+":"+p.age) //private 直接调用出错 //p.gender val p1 = new Person1("rocky",27) println("P1: "+p1.name+":"+p1.age) val p2 = new Person2("rocky",22) //println("P2: "+p2.name+":"+p2.age) val p3 = new Person3("rocky",32,"man") println("P3: "+p3.name+":"+p3.age+":"+p3.gender) var stu = new Students("rocky",22,"computer") stu.gender="man" println("stu:"+stu.toString()+"\ngender:"+stu.gender+"\nunit:"+stu.unit) } }
抽象类和trait
package per.xxl /** * @author Administrator */ class AbstractScala { } //抽象类 abstract class People{ def speak def speak2={ println("this is abstract!") } var age:Int //"final"类型只能由子类实现 val name:String } class Worker extends People{ def speak={ println("hello speak!") } //已实现的抽象方法需要加上override,可以不用重写这个方法 override def speak2={ println("hello speak2!") } var age:Int=27 //"final"类型只能由子类实现 val name:String="worker" } //特质类,可以有实现方法 trait People1{ def speak def speak2={ println("this is trait!") } var age:Int //"final"类型只能由子类实现 val name:String } class leader extends People1{ def speak={ println("this is leader") } var age:Int=23 val name:String="leader" } //继承抽象类和特质类,可以extends和with多个特质类,抽象类只能单继承 class coder extends People with People1{ def speak={ println("this is coder") } //因为people和people1都实现了speak2,所以必须要重写 override def speak2={ println("hello coder speak2!") } var age:Int=23 val name:String="coder" } //App是scala定义的一个可执行接口 //App内部帮助我们实现了main方法并管理代码 object AbstractScala extends App{ val worker = new Worker worker.speak println(worker.age+":"+worker.name) }
Apply方法
package per.xxl /** * @author Administrator */ class ApplyScala { } //apply相当于一个类的别名函数 //在单例类和普通类中有些区别 class ApplyTest{ def apply()={println("class apply在初始化val b = new ApplyTest()对象后,会当做b()的别名")} def test(){ println("test") } } //单例类,方法都是静态的 object ApplyTest{ def apply():ApplyTest={ println("object apply 会当做ApplyTest()的别名") return new ApplyTest() } def static(){ println("static test") } } object ApplyScala extends App{ ApplyTest.static() val a = ApplyTest() a.test val b = new ApplyTest() b() b.test() }
List
package per.xxl import scala.collection.mutable.ListBuffer /** * @author Administrator */ class CollectionScala { } object CollectionScala extends App{ //list的元素值是不能变的l(2)=xx编译错误 //调用静态list的apply函数 var l = List(1,2,3,4,5,6)// //声明list类型的方式 var ll:List[Int] = List(1,2,3,4,5,6) //list头添加 l = 7::l l = l.::(8) println(l+" 取第1位值:"+l(1)) //反向 println("反向:"+l.reverse) //取头元素 println("取头元素:"+l.head+" 取尾元素:"+l.last) //取除头元素以外的元素 println("取除头元素以外的元素:"+l.tail+"\n取除尾元素以外的元素:"+l.init) //过滤 println("过滤:"+l.filter(_%2==0)) //list拼接 println("拼接:"+(l:::ll)) //zip操作,对应有unzip方法,zip会丢掉多余list的数据 println("zip:"+(l zip ll)) //切割,按规则划分为两个list。注意表达式和filter的表达式两种不同的方式都可以 println("切割:"+l.partition { x => x%2==0 }) println("切割1:"+(l.partition { x => x%2==0 })._1) //合并 println("合并:"+List(l,ll,l).flatten) //按规则合并 println("合并1:"+List(l,ll).flatMap { x => x.map { x => x+1 } }) //排序 println("降序:"+l.sortWith(_>_)+" 升序:"+l.sortWith(_<_)) //通常不建议直接对List进行编辑修改等操作如果需要用BufferList var bl = ListBuffer(1,2,3,4,5) println(bl) bl(1)=99 println(bl) println(bl.toList) }
隐式转换、隐式参数、隐式类
package per.xxl /** * @author Administrator */ class Implicit { } /** * 隐式转换、隐式参数、隐式类 */ class A{ } class RichA{ def rich{ println("this is rich A") } } object Implicit extends App{ //隐式函数的参数为A implicit def AimRichA(a:A) ={ println("hei! implicit RichA") //最后一个表达式为函数返回值 new RichA() } //val a= AimRichA(new A),不用写函数名,想想类的apply()函数 val a = new A a.rich //隐式参数 def impParam(implicit name:String){ println("implicit param:"+name) } implicit val name="hello!" //使用了隐式参数 name,相当于impParam(name) impParam //也可以指定参数 impParam("hello2!") //隐式类 implicit class inc(i:String){ def add(a:Int):Int={ return a+1 } } //相当于new inc("aa").add(1) println("aa".add(1)) }
时间: 2024-10-03 10:47:25