码迷,mamicode.com
首页 > 其他好文 > 详细

scala基础入门

时间:2015-07-21 17:27:29      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

类方法、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))
}

scala基础入门

标签:

原文地址:http://my.oschina.net/laigous/blog/481360

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!