zoukankan      html  css  js  c++  java
  • Scala_学习

    下载
    配置环境变量
    cmd scala
    安装 Scala Eclipse IDEA
    package org.Scala.Test
    object Hello{
    def main(args:Array[String]):Unit={
    println("Hello,World");
    }
    }

    -----------------------------------------------
    Scala语言具备编写对象和函数式两种编程范式
    SBT:构建工具、依赖管理、编译等等
    函数式编程思想


    Scala的语言基础
    object aaa {
    println("Welcome to the Scala worksheet")
    //---------
    val a:Int=1
    println(a)

    var b:Int=2
    var c=b+a
    println(c)

    val x = 10

    val y:Int=20

    x+y

    var aa =200

    aa = 300

    aa

    lazy val f = x * y

    f*10

    val z:Double =1
    val zz:Float =2
    val zzz:Long=3
    var zzzz = 1.0

    val m= true
    val mm=false

    val u:Unit=()
    val uu =()

    def foo() = throw new Exception("error occurred")

    //---------
    val name = "wanglukai"
    s"My name is ${name}"


    //---------
    def hello(name:String):String={
    s"wanglukai,${name}"
    }
    hello("wudi")

    def hello2(name:String) ={
    s"wanglukai,${name}"
    }
    hello("wudi")

    //---------
    def add(x:Int,y:Int) = x + y //只有一个返回的话,代码块可以被省略
    add(1,2)

    //---------
    if(true) 1 else 2
    if(false) 3 else 4

    val p =1
    if(p == 1) p
    if(p != 1) "not one"
    if(p != 1) "not one" else p


    //---------
    val o = List("alice","bob","cathy")
    for(
    s<- o
    )println(s)
    for{
    s<-o
    if(s.length >3)
    }println(s)
    val result_for = for{
    s<-o
    s1 = s.toUpperCase()
    if(s1 != "")
    }yield(s)

    //---------
    try{
    Integer.parseInt("dog")
    }catch{
    case _ => 0
    }finally{
    println("always be printed");
    }

    //---------
    val code = 1
    code match{
    case 1 => "one"
    case 2 => "two"
    case _ => "others"
    }

    //---------
    //求值策略
    def foo(x:Int) = x
    def foo(x: => Int) =x

    //---------
    def test1(x:Int,y:Int):Int= x*x
    test1(3+4,8)

    //def test1(x:=>Int,y:=>Int):Int= x*x
    //test2(3+4,8)

    //def bar(x:Int,y:=>Int) =1
    //def loop():Int = loop //递归函数
    //bar(1,loop)
    //bar(loop,1)

    //---------
    def add(x:Int)(y:Int) =x+y
    add(2,2);
    }
    三种变量修饰符
    val 常亮
    var 变量
    lazy val 惰性求值的常量 如果定义的变量在后续的使用不会用到,可以定义
    *可以不显示指定变量的类型,因为Scala会自动进行类型推导

    Scala数据类型
    Any
    AnyVal 值类型
    Numeric types
    Boolean
    Char
    Unit
    AnyRef 引用类型
    All java.*
    ref types

    All scala.*
    ref types
    Null 引用类型最后一个子类
    Nothing 值类型和引用类型最后一个子类

    String:构建与Java的String之上,新增了字符串插值(interpolation)的特性
    语法:var name = "wanglukai"
    s"My name is ${name}"

    代码块组织多个表达式、而代码块也是一个表达式:
    语法:{exp1;exp2}
    {
    exp1
    exp2
    }
    Block也是表达式,其最终的求得的值是最后一个表达式的值
    函数:
    语法:def funcationName(param:ParamType):ReturnType={

    }
    if表达式 而不是语句
    语法:if(logical_exp) valA else valB

    for表达式语法:for{
    x<- xs
    y= x+1
    if(y>0)
    }yield y
    tyr表达式try{
    Integer.parseInt("dog")
    }catch{
    case _=> 0
    }finally{
    println("always be printed");
    }

    match表达式,类似Java swich
    code match{
    case 1 => "one"
    case 2 => "two"
    case _ => "others"
    }


    求值策略
    Scala里有两种求值策略
    Call By Value 对函数实参求值,且仅求值一次
    Call By Name 函数实参每次在函数体内被用到时会求值

    Scala通常使用Call By Value
    如果函数形参类型以 => 开头,会使用 Call By Value
    //求值策略
    def foo(x:Int) = x
    def foo(x: => Int) =x

    def test1(x:Int,y:Int):Int= x*x
    test1(3+4,8)

    //def test1(x:=>Int,y:=>Int):Int= x*x
    //test2(3+4,8)

    //def bar(x:Int,y:=>Int) =1
    //def loop():Int = loop //递归函数
    //bar(1,loop)
    //bar(loop,1)

    高阶函数
    函数式第一等公民
    Scala语言支持
    把函数作为实参传递给另一个函数
    把函数作为返回值
    把函数赋值给变量
    把函数存储在数据结构里
    在Scala中,函数就像普通变量一样,同样也具有函数的类型。

    函数的类型
    Int => String 是把整形映射为字符串的函数类型

    高阶函数:用函数作为形参或返回值,成为高阶函数
    def operate(f:(Int,Int) => Int)={
    f(4,4)
    }
    匿名函数:就是函数常常量
    (形参列表) => {函数体}
    def greeting() = (name:String) => {"hello"+""+name}

    柯里化函数:把具有多个参数的函数转换为一条函数链,每个节点上是单一参数
    例子:一下两个add函数定义是等价的
    def add(x:Int,y:Int) = x+y
    def add(x:Int)(y:Int) =x+y
    add(2,2);

    val addOne = add(1)_
    addOne(2)

    递归函数:在函数式编程中是实现循环的一种技术,因为在函数式编程中没有循环???
    例子:计算n!
    def factorial(n:Int):Int =
    if(n <= 0) 1
    else n * factorial(n - 1)

    递归函数优化方案、尾递归:避免堆栈溢出

    尾递归函数:中所有递归形式的调用都出现在函数的末尾。
    当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
    例子:@annotation.tailrec 对尾递归优化
    def factorial(n:Int,m:Int):Int=
    if(n <=0 )m
    else factorial(n - 1,m * n)

    factorial(5,1)

    例子:
    def sum(f:Int => Int)(a:Int)(b:Int):Int={

    @annotation.tailrec
    def loop(n:Int,acc:Int):Int={
    if(n > b){
    println(s"n=${n},acc=${acc}")
    acc
    }else {
    println(s"n=${n},acc=${acc}")
    loop(n+1,acc+f(n))
    }
    }
    loop(a,0)
    }
    sum(x => x)(1)(5)
    sum(x => x * x)(1)(5)
    sum(x => x * x *x)(1)(5)
    val sumSquare = sum(x => x * x)
    sumSquare(1)(5)

    Scala Immutable Collection

    Collections-list基本使用
    List[T] :T类型,Scala有类型推导、不写也罢
    val a = List(1,2,3,4)
    val b = 0 :: a
    var c = "x" :: "y" :: "z" :: Nil

    "z" :: Nil
    "y" :: res0
    "x" :: res1
    val d = a ::: c //连接操作符

    a.head //访问元素(方法)
    b.head
    c.head
    a.tail //返回除了第一个元素的所有元素
    c.tail
    a.isEmpty //判断函数、判断List是不是空
    Nil.isEmpty

    def walkthru(l:List[Int]):String = {
    if(l.isEmpty) ""
    else l.head.toString + " " + walkthru(l.tail)
    }
    walkthru(a)

    list高级使用

    a.filter(x => x % 2 == 1) //参数是匿名函数

    "99 Red Balloons".toList
    "99 Red Balloons".toList.filter(x => Character.isDigit(x))
    "99 Red Balloons".toList.takeWhile(x => x != 'B')

    list-map

    c.map(x => x.toUppercase) //大写
    c.map(_.toUppercase) //_用于通配
    a.filter(_ % 2 == 1)
    a.filter(_ % 2 == 1).map(_ + 10)

    val q = List(a,List(4,5,6))//拿出偶数
    q.map(x => x.filter( _ % 2 == 0))
    q.map( _.filter( _ % 2 ==0))
    q.flatMap( _.filter( _ % 2 ==0))
    reduceLeft与flodLeft

    a.reduceLeft((x,y) => x + y)
    a.reduceLeft(_ + _)

    a.foldLeft(0)(_ + _) 比前者通用
    a.foldLeft(1)(_ * _)

    Rang与Stream

    Rang:1 to 10
    1 to 10 by 2
    (1 to 10).toList
    1 until 10
    Stream:
    1 #:: 2 #::3 #:: Stream.empty
    val stream = (1 to 10000).toStream
    stream.head //访问
    stream.tail
    toupe与map
    Tuple: //元组
    (1,2)
    1 -> 2
    val t =(1,"Alice","Math",95.5)
    t._1 //访问
    t._2
    t._3
    t._4
    def sumSq(in : List[Int]):(Int,Int,Int) =
    in.foldLeft((0,0,0))((t,v) => (t._1 +1,t._2 +v,t._3 +v*v))
    sumSq(a)

    Map[K,V]
    val p = Map(1 -> "David",9 -> "Elwood")
    p(1) //取值
    p(9)
    p.contains(1) //判断有没有
    p.contains(2)
    p.keys //查询所有K
    p.values //查询所有V
    p + (8 -> "Archer") //添加
    p _ 1 //删除
    p ++ List(2 -> "Alice", 5 -> "Bob")//添加多个
    p -- List(1,9,2)//删除多个
    p ++ List(2 -> "Alice", 5 -> -- List(9,1)

    实现快速排序

    def qSort(a:List[Int]):List[Int] =
    if(a.length < 2) a
    else
    qSort(a.filter( _ < a.head)) ++
    a.filter( _ == a.head) ++
    qSort(a.filter( _ > a.head)) //> qSort: (a: List[Int])List[Int]


    qSort(List(3,1,2)) //> res0: List[Int] = List(1, 2, 3)
    qSort(List(9,3,2,1,4,7,8,5)) //> res1: List[Int] = List(1, 2, 3, 4, 5, 7, 8, 9)


    只是大致认知,还不算入门!!!
    ----------------------------------------------------


    初始Scala
    了解Scala是什么,学习Scala的意义何在,Scala安装,快速入门,
    Scala与Java开发对比。


    Scala入门
    掌握Scala变量与常亮,数据类型,lazy的使用,Scala开发IDEA的使用,
    IDEA整合Maven搭建Scala程序开发环境。

    Scala函数
    掌握函数在Scala中的定义以及使用的注意事项,条件以及循环表达式在Scala中的使用。

    Scala对象
    Scala中的重中之重,务必要掌握,
    涉及到的内容有:类、构造器、继承、重写抽象类、“伴生类”以及“伴生对象”,
    apply方式的使用、case class以及trait。


    Scala集合
    掌握Scala中的数组、List、Set、Map、Tuple、Option的使用


    Scala模式匹配
    掌握Scala中的模式匹配:基本、Array、类型、case class、Option的模式匹配、Scala中异常处理


    Scala函数高级操作
    掌握Scala中字符串的高级操作、匿名函数、偏函数、高阶高数的使用(重点)

    Scala隐式转换
    这是Scala中的亮点所在、也是最难理解的部分


    Scala操作外部数据
    使用Scala读写文本文件、网络数据、MySQL数据以及XML文件


    项目实战
    综合Scala前面的知识点、结合项目并整合SpringBoot进行项目实战

  • 相关阅读:
    关于Xil_Assert断言产生的死循环,导致程序未执行的问题
    Unable to connect to ps7_cortexa9的参考解决方案Zedboard,zynq
    Xilinx SDK下载时出现的几个问题总结
    深入分析SCU GIC驱动 1 ZEDBOARD,ZYNQ7000
    Git命令行介绍和使用说明(持续更新)
    常用快捷键—Webstorm入门指南
    数组和链表的关系
    把Sublime Text 2固定到Ubuntu启动器
    Node的Eclipse插件 Nodeclipse
    Sublime 自定义格式化快捷键
  • 原文地址:https://www.cnblogs.com/Bkxk/p/9371641.html
Copyright © 2011-2022 走看看