2021-05-15

scala day07

偏函数

package com.gc.scala.day07

/**
 * Author guochao
 * Date 2021/5/15
 */
object Pattern2 {
  def main(args: Array[String]): Unit = {
    val list = List(10, 20, 1, "aa", false)

    /*val r = list.filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int]).sum
    println(r)*/

    val f: PartialFunction[Any, Int] = new PartialFunction[Any, Int] {
      // 只对返回值是true的那些元素进行处理, 是false的跳过
      override def isDefinedAt(x: Any): Boolean = x match {
        case a: Int  => true
        case _ => false
      }

      // 是true的时候, 交给apply进行处理
      override def apply(v1: Any): Int = v1 match {
        case a : Int => a
      }
    }

    // 等价于 filter + map
    val a =  list.collect(f)
    println(a)

  }
}

/*
偏函数
   偏的意思: 偏爱


 */

package com.gc.scala.day07

/**
 * Author guochao
 * Date 2021/5/15
 */
object Pattern3 {
  def main(args: Array[String]): Unit = {
    val list = List(10, 20, 1, "aa", false)

    val list2 = list.collect({
      case a: Int => a
    })
    println(list2)
  }
}

/*
用一对大括号括起来的一个或多个case语句就是偏函数

偏函数使用的地方很多, 但是大部分情况都是把给他当成一个普通的函数来使用

 */

异常

def main(args: Array[String]): Unit = {

    try {
        var n= 10 / 0
    }catch {
        case ex: ArithmeticException=>{
            // 发生算术异常
            println("发生算术异常")
        }
        case ex: Exception=>{
            // 对异常处理
            println("发生了异常1")
            println("发生了异常2")
        }
    }finally {
        println("finally")
    }
}

1)我们将可疑代码封装在try块中。在try块之后使用了一个catch处理程序来捕获异常。如果发生任何异常,catch处理程序将处理它,程序将不会异常终止。
2)Scala的异常的工作机制和Java一样,但是Scala没有“checked(编译期)”异常,即Scala没有编译异常这个概念,异常都是在运行的时候捕获处理。
3)异常捕捉的机制与其他语言中一样,如果有异常发生,catch子句是按次序捕捉的。因此,在catch子句中,越具体的异常越要靠前,越普遍的异常越靠后,如果把越普遍的异常写在前,把具体的异常写在后,在Scala中也不会报错,但这样是非常不好的编程风格。
4)finally子句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作,这点和Java一样。
5)用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方
def test():Nothing = {
throw new Exception(“不对”)
}
6)Scala提供了throws关键字来声明异常。可以使用方法定义声明异常。它向调用者函数提供了此方法可能引发此异常的信息。它有助于调用函数处理并将该代码包含在try-catch块中,以避免程序异常终止。在Scala中,可以使用throws注释来声明异常

def main(args: Array[String]): Unit = {
  	f11()
}

@throws(classOf[NumberFormatException])
def f11()={
  	"abc".toInt
}
package com.gc.scala.day07

import java.io.IOException
import scala.io.StdIn

/**
 * Author guochao
 * Date 2021/5/15 
 */
object ExecptionDemo1 {
  def main(args: Array[String]): Unit = {
    val i = StdIn.readInt()
    if(i == 0) throw new ArithmeticException("除数不能是0")


    try {
      //            var i = 1 / 1
      //            new FileInputStream("aa")

    }catch{
      case e: ArithmeticException =>
        println("发生算术异常")
      case e:Exception =>
        println("运行时异常")
      case _ =>
    }finally {
      //不管有没有异常, 都会走这里
      println("释放资源")
    }
    println("aaa")

    //----
    try{
      foo()
    }catch {
      case e: IOException =>
    }
  }

  @throws(classOf[IOException])
  @throws(classOf[RuntimeException])
  def foo() = {
    println("aaaa")
  }
}

/*
在scala中, 不强制要求必须处理异常

如何处理异常:
    1. 抛出异常类型
        throws 异常类型
    2. try
抛出异常对象:
    throw new 异常对象
java:
    运行时异常
        可以不用提前处理, 将来运行的时候可能会抛异常
    受检异常(checked)
        在编译阶段, 异常必须被处理
            1. try
            2. 抛出异常类型 throws 异常类
 */

泛型

泛型类和泛型函数
package com.gc.scala.day07.generic

/**
 * Author guochao
 * Date 2021/5/15 
 */
object Generic1 {
  def main(args: Array[String]): Unit = {
    val p1 = new Point[Int](10, 20)
    val x = p1.x

    val p2 = Point(11.1, 1)
    val y = p2.y

    val i = p1.dis[String]("10")

  }
}

case class Point[T](x: T, y: T){
  var z:T = x
  def foo():T = x

  def dis[A](a: A) = a
}


/*

1. 泛型类和泛型方法入手

 数据类型参数化

 a: 泛型类
    定义类的时候, 定义泛型, 这个泛型就可以在类的任何的地方使用

    当成一个类型来使用

 b: 泛型方法或者泛型函数
    定义函数的时候, 定义泛型, 这个泛型只能在函数的内部使用


*/
泛型的上下界
package com.gc.scala.day07.generic

/**
 * Author guochao
 * Date 2021/5/15 
 */
case class AA(val age: Int) extends Ordered[AA]{
  override def compare(that: AA): Int = age - that.age
}
object Generic2 {
  def main(args: Array[String]): Unit = {
    val aa = compare(new AA(10), new AA(20))

    println(aa)

  }

  def compare[T <: Ordered[T]](x: T, y: T):T = {
    if(x > y) x
    else y
  }
}
/*
泛型的界定

    泛型的上下界(上下限)

    上限

    上下文界定
    视图界定

下限
 */

上下文界定
package com.gc.scala.day07.generic

/**
 * Author guochao
 * Date 2021/5/15
 */
case class People(age:Int, name: String)
object People{
  implicit val ord: Ordering[People] = new Ordering[People](){
    override def compare(x: People, y: People): Int = x.age - y.age
  }
}

object ContextBound {
  def main(args: Array[String]): Unit = {
    println(max(10, 20))
    println(max("10", "20"))
    println(max(People(10, "a"), People(20, "b")))
  }
  // 让max方法可以比较一个普通的样例类对象


  def max[T: Ordering](x: T, y: T) = {
    // 从冥界召唤隐式值
    val ord = implicitly[Ordering[T]]
    if(ord.gt(x, y)) x
    else y
  }


  /*def max[T](x: T, y: T)(implicit ord: Ordering[T]) = {
      // x < y   | 找一个比较器, 去比较x, y Ordering[T]
      if(ord.gt(x, y)) x
      else y
  }*/
}
/*
上下文界定:
    [T: Ordering]
        表示存在一个隐式值: Ordering[T]

        得用召唤的方式把隐式召唤出来

    等价于: 隐式值 + 隐式参数
上下文:
    环境
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值