Scala简单基础语法

import java.util.Date

class ScalaTest1 {

}

//在scala里面没有static关键词的,在 object修改的代码块中定义的方法或者变量或者常量都是静态的
object ScalaTest1{
  def main(args: Array[String]) {
    //常量
    val name:String = "hello scala"
    //变量
    var age = 10
    println(name + "\t" + age)

    var person=new Person(name,age)
    person.hello()
  }
}

class Person(param1:String,param2:Int){
    var name=param1
    var age=param2
  //Unit 表示没有返回值等同于void
  def hello():Unit={
    print("名称为:"+name+"\t"+age)
  }
}

object ScalaTest2{
  def main(args: Array[String]): Unit = {
    //if else
    var age=18
    if (age<18){
      println("18岁")
    }else if (18<=age && age<=20){
      println("18-20之间")
    }else{
      println("大于20")
    }

    //for循环
    for (i<- 1 to 10){
      println(i)
    }
    for (i<- 1 until 10){
      println(i)
    }
    //i<- 1 to 10 代表 将1 到10 的数据复制给i(包括10)
    //i<- 1 until 10 代表 将1 到10 的数据复制给i(不包括10)

    //双层for循环
    for (i<- 1 to 10;j<- 1 until 10){
      println("i="+i+"j="+j)
    }
    //for循环加判断打印偶数
    for (i<-1 to 10;if (i%2==0)){
      println(i)
    }
    //scala 可以不用写分好

    //for循环的yield关键词用法,将每次迭代的数值存入一个list数组中
    val list = for(i <- 1 to 10 ; if i % 2 == 0) yield i
    for(elem <- list){
      println(elem)
    }

    //while循环
    //scala中不能使用count++,count--只能使用count = count+1 ,count += 1
    var index = 0
    while(index < 100 ){
      println("第"+index+"次while 循环")
      index += 1
    }

    //这是一个完整版的函数
    def fun1(a:Int,b:Int):Int = {
      return a+b
    }
    //这是一个简化版的函数   最后一行语句的执行结果就是这个函数的返回值
    def fun1_01(a:Int,b:Int) = {
      a+b
    }
    println(fun1(1,2))
    println(fun1_01(1,2))

    //创建一个带有默认值参数的函数   函数中参数的默认修饰符是val
    def fun2(a:Int,b:Int=10,c:Int = 20)={
      a+b+c
    }
//    println(fun2(1))
//    println(fun2(1,2,3))

    //创建一个可变参数长度的函数
    def fun3(elems:Int*)={
      for(elem <- elems){
        println(elem)
      }
    }
    fun3(1,2,3,4,5,6,7,8,9)

    //递归函数    求解5 的阶乘   推测类型 需要有依据 找不根据推测不出类型的
    def fun4(num:Int):Int = {
      if(num == 1){
        num
      }else{
        num * fun4(num - 1)
      }
    }
    println(fun4(5))

    //匿名函数 : 没有名字的函数
    val fun5 = (name:String,facePower:Double) => {
      println(name + "\tfacePower:" + facePower)
    }
    fun5("scala",100)

    //偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数
    def log(date:Date,log:String) = {
      println(date + "\t" + log)
    }

    //在调用log函数的时候  每次都需要传入一个date对象  烦
    val date = new Date()
    log(date,"log1")
    log(date,"log2")
    log(date,"log3")

    val logWithDate = log(date,_:String)
    logWithDate("log1")
    logWithDate("log2")
    logWithDate("log3")


    /**
      * 什么是高阶函数?
      *   函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数
      *   scala支持面向函数编程
      *   scala支持面向对象变成
      *
      *   fun6函数的参数要一个函数  要一个什么样的函数?
      */
    def fun6(f:(Int,Int) => Int):Int = {
      f(100,200)
    }
    def f(a:Int,b:Int) = {
      a+b
    }
    println(fun6(f))

    //原则:匿名函数中参数在函数体中只出现一次可以用_代替
    println(fun6((a:Int,b:Int)=>{a+b}))
    println(fun6((_+_)))


    val str1 = "hello scala1"
    val str2 = "hello scala2"
    val str3 = "HELLO scala3"
    println(str1.indexOf('o'))

    println(str1.equals(str3))
    //不区分大小写
    println(str1.equalsIgnoreCase(str3))

    //创建一个可变长度的字符串
    val strBuilder = new StringBuilder
    strBuilder.+('F')
    strBuilder.++=("Hello")
    strBuilder ++= "  World"
    strBuilder.append(" Scala")
    strBuilder += ('P')
    println(strBuilder)


    //创建了一个长度为10的数组   数组中元素的类型必须是Int
    val arr = new Array[Int](10)

    for(index <- 0 until arr.length){
      arr(index) = index * index
    }

    arr.foreach((x:Int)=>{
      println(x)
    })
    //简化版
    arr.foreach(println)


    //List集合
    val list1 = List(1,2,3,4,5,6,7,8,9)
    list1.foreach(println)
    //    filter:过滤元素
    def fl(x:Int):Boolean={
      x > 3
    }

    println("=============================================================")
    var filtered = list.filter(fl)
    filtered.foreach(println)
    filtered = list.filter((x:Int) =>x > 3)
    filtered.foreach(println)

    //    count:计算符合条件的元素个数
    val count = list.count((x:Int) => {
      x > 1
    })
    println(count)

    //    map:对元素操作
    val list2 = List("hello 11111","hello 22222","hello 33333")
    //map函数传入的匿名函数的参数的类型一定是与集合中元素的类型一致
    //map函数传入的匿名函数的返回值的类型就是这个新集合的泛型
    val rest = list2.map((x:String) => {
      x.split(" ")
    })
    rest.foreach((x:Array[String])=>{
      x.foreach(println)
    })
    //    flatmap :压扁扁平,先map再flat
    val rest1 = list2.flatMap((x:String) => {
      x.split(" ")
    })
    rest1.foreach(println)



    //set集合
    val set1 = Set(1,2,3,4,4)
    val set2 = Set(1,2,5)
    //交集   scala中字符有可能也是方法名
    val rest3 = set1.intersect(set2)
    val rest4 = set1.&(set2)
    rest4.foreach(println)

    println("===============取两个集合的差集===================")
    //取两个集合的差集   在set1集合中存在的但是set2集合中没有的元素
    set1.diff(set2)
    set1.&~(set2).foreach(println)

    val str = set1.mkString("~")
    println(str)

    set1.max
    set1.min

    set1.toList


    val map = Map(
      "1" -> "scala",
      2 -> "scala1",
      (3,"scala2")
    )
    val keyIterator = map.keys.iterator
    while(keyIterator.hasNext){
      val key = keyIterator.next()
      println(key + "====" + map.get(key).get)
    }

    println(map.get("1"))
    println(map.get("1000").getOrElse("no result"))

    map.foreach((x:(Any,String)) => {
      val key = x._1
      val value = x._2
      println("key:" + key + "\tvalue:" + value)
    })

    println(map.contains("1"))




    //============================Tuple============================
    val t2 = (1,2)
    val t3 = Tuple3(1,2,3)
    val t4 = Tuple4("scala",1,true,1.0)
    val t44 = ("scala1",1,true,1.0)
    println(t2._2)
    val iterator = t44.productIterator
    while(iterator.hasNext){
      //在循环体内不要调用多次next方法
      println(iterator.next())
    }
    //二元组对象才有swap:调换位置
    val s2 = t2.swap
    println(s2._1)

    //============trait==============================
    /**
      * trait可以类比成java中的接口  但是比java接口更高级一些
      *   trait中可以定义方法也可以实现方法
      */
    val s = new Student
    s.read("scala")
    s.listen("I Like")
    s.sayName("scala Like")
  }

}

trait Read {
  def read(name:String){
    println(name+" is reading")
  }

  def sayName(name:String):String
}

trait Listen {
  def listen(name:String){
    println(name + " is listenning")
  }
}

class Student extends Read with Listen{
  override def sayName(name: String): String = {
    println("say you:" + name)
    name
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容