Scala基本语法总结

直接上代码

idea安装scala之后直接运行即可

1.基本属性,集合,方法使用

import scala.collection.mutable.ArrayBuffer
import scala.util.Sorting

object ScalaTestDemo extends  App  {
  //引用不可变 内容可以变
  println("---------------------------")
  val a = Array(1,2,3)
  val t=Array("a","b","c")
  print(a.zip(t).foreach(i => print(i)))

  a(0)=10
  print(a(0)+a(1))
  println()

  //值类型 引用类型

  //操作相当于方法调用  无++ --
  println("---------------------------")
  print(1.+(2))
  println()

  //表达式 有返回结果
  println("---------------------------")
  var b=10
  val c=if(b>0) 100
  print(c)
  println()

  //循环
  println("---------------------------")
  for(i <- 1 to 10){print(i)}
  for(i <- 1 until  10){print(i)}
  val scala="scala"
  for(i <- 0 until  scala.length){print(scala(i))}
  for(i <- 1 to 3;j <- 1 to 3 if(i != j) ) print(i+j)
  val w = for(i <- 1 to 3 ) yield i*10
  print(w.mkString(" "))
  printf("%s占位符测试","aa")
  cicle()
  def cicle() {
    var r = 30
    while (r > 0) {
      r -= 1
      print(r)
    }
  }
  println()

  //Array 变长  List 定长
  println("---------------------------")
  var listq = List(1,2,3)
  listq.+:(0)
  listq.:+(0)
  /**
    * Scala的Seq将是Java的List,Scala的List将是Java的LinkedList。
    */
  var liste = 0::listq
  var list = Array(1,2,3,4)
  var list2=list.reverse
  var list1=Array.apply(5,6,7)
  print(list.mkString("  "))
  print(list1.mkString("  "))
  print(list2.mkString("  "))
  list(1)=100
  print(list.mkString("  "))

  var arrayBuffer = ArrayBuffer(1,2,3,4,5,6)
  arrayBuffer.trimEnd(1)
  print(arrayBuffer.mkString("  "))
  arrayBuffer.insert(3,100)
  print(arrayBuffer.mkString("  "))
  arrayBuffer.insert(3,200,300,400)
  print(arrayBuffer.mkString("  "))
  arrayBuffer.remove(3)
  print(arrayBuffer.mkString("  "))
  println("--------------aa-------------")
  val q = arrayBuffer.toArray
  Sorting.quickSort(q)
  print(q.mkString("  "))
  println()

  //Set
  println()
  println("---------------------------")
  var set1 = Set(1,2,3)
  set1 += 5
  print(set1)
  set1.head
  print(set1.tail)
  var set2 = Set(7,8,9,10)
  var set3= set1 ++ set2
  print(set3)
  println()

  //循环遍历Map中的元素
  println("---------------------------")
  var persons = Map("chinese" -> 6,"english" -> 7)
  persons += ("france" -> 4)
  for((key,value) <- persons) print(key+value)
  persons -= ("france")
  for((key,value) <- persons) print(key+value)
  print(persons("chinese"))
  print(persons.isEmpty)
  print(persons.keys)
  print(persons.values)
  //option 防止返回值为null
  val as =persons.getOrElse("aa","")
  println()

  //定义了一个Tuple,里面有n个不同类型的元素
  println("---------------------------")
  val tuple =("aa",11,11.23,"bb")
  print(tuple._1)
  print(tuple._3)
  print(tuple._4)
  tuple.productIterator.foreach(i => print(i));
  println()

  //s字符串插值器
  val name="hehe"
  print("hello"+s"hello,+$name");
  //raw 不做转化
  print(raw"aaaaa\aaaa/aaaa")
  println()

  /**
    * 函数
    */
  println("---------------------------")
  say("aa")
  def say(name:String){
    println(name)
  }
  println(aa(3))
  def aa(i:Int) : Int = i+2
  println(bb(3))
  def bb(i:Int) : Int = { i+2
    i+3
    3+4
     }

  def prininfo(name:String = "hello scala") = print(name)
  prininfo()
  prininfo("haha")

  println("---------------------------")
  def fun:(Int,Int)=>Int =  (_+_)
  val e= fun(1,2)
  prininfo(e+"")

  /**
    * Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
    * Scala 中的方法跟 Java 的类似,方法是组成类的一部分。
    * Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
    * Scala 中使用 val 语句可以定义函数,def 语句定义方法。
    */

  /**
    * 不同点:
    *      1.Array 中的元素值可变,List和Tuple中的元素值不可变
    *      2.Array通常是先确定长度,后赋值,而List和Tuple在声明的时候就须要赋值
    *      3.Array取单个元素的效率非常高。而List读取单个元素的效率是O(n)
    *      4.List和Array的声明不须要newkeyword。而Tuple声明无论有无new 都能够
    *           5.Tuple中的元素最多是22
    */


}

2.类,特质,抽象类

import Person.Man


/***
  * 在scala中,类名可以和对象名为同一个名字,该对象称为该类的伴生对象,类和伴生对象可以相互访问他们的私有属性,但是
  * 他们必须在同一个源文件内。
  *
  * @param name
  * @param age
  */
class Person(val name: String, val age: String) {}

//类
/***
  * 为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。在没有值的时候,使用None,这是Option的一个子类。如果有值可以引用,就使用Some来包含这个值。Some也是Option的子类。
  */
/***
  * 在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式
  */
object Person {
  def apply(name: String, age: String) = new Person(name, age)
  def unapply(person: Person): Option[(String, String)] = {
    if(person == null) {
      None
    } else {
      Some(person.name, person.age)
    }
  }

class Man extends Person(name = "aa",age = "123") with animal
  {
    override def toString = getClass.getName +"name="+name+"age"+age
  }



}

//可以相互调用私有方法
object ClassTest extends App {
  val a = new Person("aa", "12")
  val b = Person("bb", "234")
  print(a.name)
  print(a.age)
  print(b.name)
  print(b.age)
  print(a.isInstanceOf[Person])

  val c= new Man();
  print(c.toString)
  /***
    * apply  传入属性赋值  返回时对象
    * unapply 传入的时对象 提取的属性值
    */


  val person = Person("aaa", "123")
  person match {
    case Person(name, "RMB") =>  println("RMB: " + name)
    case _ => println("Not RMB!")
  }


    var child = Child("aa",123)
    print(child.name)
    var child1 = child.copy()
    print(child1.age)
    if (child == child1) print(true)
  else print(false)
}

trait animal
{
  def speak(): String =
  {
    print("aa")
  "aa"
  }

}

/***
  * 特质和抽象类区别时 有参构造函数
  */
abstract class animals
{
  def aa(age:Int,name:Int)

}

/***
  * 样例类节省了get set 默认val 可以改war
  * @param name
  * @param age
  */
case class Child (var name:String,age :Int)

/***
  * 密封类
  * 在使用case 类来做模式匹配时,你可能想让编译器帮你确保已经列出了所有可能的选择。那么通常就要将通用超类声明为sealed:
  */


3.match用法,正则用法,文件读取


object Match extends App
{

  trait  Say {}
  case class AA(age:String) extends Say
  {
    print("aa")
  }
  case class BB(age:String) extends Say
  {
    print("BB")
  }
  case class CC(age:String)extends Say
  {
    print("CC")
  }

  def matchclass (say :Say): Unit =
  {
    say match {
      case AA(age:String) => print("aa")
      case _ => print("on")
    }
  }

  var ss= AA("11")
  matchclass(ss);

  val a = "1123"
  val b = "11"
  val B ="1123"
  a match {
    //case b => print("ok")
    case B => print("big")
    case _ => print("on")
  }

  var list = List(1,2,3)
  list match {
    case List(_,_,3) => print("ok")
    case _ => print("no")
  }
}


import scala.util.matching.Regex

object  RegexTest extends App{
  val patten = new Regex(raw"[0-9]+[a-z]")
  val  aa = "1000aaa12"
  for(i <- patten.findAllIn(aa)) print(i)
  val sd = patten.findAllIn(aa)
  print(sd.next())
}
import java.io.PrintWriter

import scala.io.Source

object  FileTest extends App{

  //val source = Source.fromFile("scala/src/test.txt")

  /**
    * 读取行
    */
 /* val lines = source.getLines()
  for(line <- lines) {
    println(line)
  }
  source.close()*/

  /**
    * 读取字符
    */
 /* val it = source.buffered
  while(it.hasNext)
    {
      println(it.next())
    }
  source.close()*/

  /**
    * 读取网络文件
    */

  val source = Source.fromURL("http://www.baidu.com")
  val lines = source.getLines()
  for(line <- lines) {
    println(line)
  }
  source.close()

  //写文件
  val out =new PrintWriter("scala/src/write.txt")
  out.println("11")
  out.close()
}

4.常用函数,高阶函数

object FunctionTest extends  App  {
  /**
    * 偏函数
    */
  val pf:PartialFunction[Int,String] = {
     case 1=>"One"
     case 2=>"Two"
     case 3=>"Three"
     case _=>"Other"
     }
  pf.isDefinedAt(1)

  val onePF:PartialFunction[Int,String] = {
    case 1=>"One"
  }

  val twoPF:PartialFunction[Int,String] = {
    case 2=>"Two"
  }

  val threePF:PartialFunction[Int,String] = {
    case 3=>"Three"
  }

  val otherPF:PartialFunction[Int,String] = {
    case _=>"Other"
  }
  /**
    * orElse 组合使用
    */
  val newPF = onePF orElse twoPF orElse threePF orElse otherPF

  print(newPF(1))

  /**
    * andThen: 相当于方法的连续调用,比如g(f(x))。
    */
  val pf1:PartialFunction[Int,String] = {
    case i if i == 1 => "One"
  }

  val pf2:PartialFunction[String,String] = {
    case str if str eq "One" => "The num is 1"
  }

  val num = pf1 andThen pf2

    print(num(1))


  /*val onePF:PartialFunction[Int,String] = {
    case 1=>"One"
  }*/
  /**
    * 匹配返回前面  不匹配返回后面
    */
  print(onePF.applyOrElse(1,{num:Int=>"two"}))
  print(onePF.applyOrElse(2,{num:Int=>"two"}))

    /**
    * 偏应用函数
    */
   def add(x:Int,y:Int,z:Int) = x+y+z
   def addX = add(1,_:Int,_:Int) // x 已知
   addX(2,3)

  var list1 = List(1,2,3,45)
  list1.min
  list1.max
  list1.sum
  list1.filter( i => i%2==0)

  var list2= List(7,8,9)
  var list3 = List(list1,list2)
  print(list3)
  print(list3.flatten)
  var list4= list3.flatten.map(t => List(t,t))
  print(list4)

  var list5=list4.flatten
  println()
  print(list5)
  print(list5.reduce(_+_))

  var list6 = List(1,2,3,4,5,6,7)
  print(list6.reduceLeft(_-_))
  print(list6.reduceRight(_-_))
  print(list6.reduce(_-_))
  print(list6.foldRight(10)(_-_))

}
object HighFunction extends App{
  /**
    * 高阶函数 入参和返回值都是函数
    */
  val a =  Array(1,2,3)

  val fun = (x:Int) => x*2

  /**
    * 传入的是函数
    */
  var res= a.map(fun)
  print(res.foreach(t =>{print(t)}))

  /**
    * 返回值是函数  最后一行 方法里面有
    */
  def fun1 (a:String,b:String):(String ,String ) =>String =
  {
    val c = a+b
    (a:String,b:String)=>s"$c"+a+b
  }
  val fun2=fun1("cc","vv")
 print(fun2("ee","rr"))

  /**
    * 闭包  cc vv 就是一个闭包
    */

  /**
    * 柯里化   n参数 的函数 =》 1个参数 + n-1个参数的函数
    */

  //两个参数的函数变成两个函数一个参数
  def first(x:Int):Int => Int = (y:Int)=>x+y
  val s= first(1)
  print(s(2))



}

5.隐式类


/**
  * 隐式类
  */
object ImplicitTest extends App
{
  print(4.times())
  implicit class IntTime(x:Int)
  {
    def times[A] (f: => A): Unit =
    {
      def loop (current : Int): Unit =
      {
        if(current>0)
          {
            f
            loop(current-1)
            print("ok")
          }
      }
      loop(x)
    }
  }

  /**
    * 隐式转化函数
    */

  var a:Int =10
  var b:Double =10.55


  implicit def doubletoin (x:Double) = x toInt

  a = b
  b =a

  /**
    * 隐式对象 就是一个参数
    */

  implicit val ea:Int = 10;
  def gg(x:Int,y:Int)(implicit ae:Int): Unit = {
    print(ae)
  }
  gg(1,2)
}

6.Actor线程及通信(百度)

你可能感兴趣的:(Scala基本语法总结)