• Scala 之嵌套匹配


    /**
     * 嵌套匹配模式
     *
     * 样例类经常被用作嵌套结构.
     *
     * 例如: 某商场售卖货物, 经常把商品捆绑在一起进行打折销售.
     *
     * 案例:
     *
     * 现在有一些商品,请使用 Scala 设计相关的样例类,完成商品可以捆绑打折出售。
     *
     * 要求商品捆绑可以是单个商品,也可以是多个商品。
     *
     * 打折时按照折扣xx元进行设计.
     *
     * 能够统计出所有捆绑商品打折后的最终价格
     */
    
    
    /**
     * 统计商品的价格
     */
    object GoodsDis {
      def main(args: Array[String]): Unit = {
    
        //这里给出了一个具体的打折的案例 // 120.
        val sale = Bundle("书籍", 10, Book("漫画", 40), Bundle("文学作品", 20, Book("《阳关》", 80), Book(" 《围城》", 30)))
    
        //知识点 1 - 使用 case 语句,得到 "漫画"
        val res = sale match {
          //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
          case Bundle(_, _, Book(desc, _), _*) => desc
        }
    
        println("res=" + res) //
        //知识点 2-通过@表示法将嵌套的值绑定到变量。_*绑定剩余 Item 到 rest
        val res2 = sale match {
          //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
          case Bundle(_, _, art @ Book(_, _), rest @ _*) => (art, rest)
        }
        println("res2=" + res2)
    
        //知识点 3-不使用_*绑定剩余 Item 到 rest
        val res3 = sale match {
          //如果我们进行对象匹配时,不想接受某些值,则使用_ 忽略即可,_* 表示所有
          case Bundle(_, _, art3 @ Book(_, _), rest3) => (art3, rest3)
        }
        println("res3=" + res3)
    
    
        val sale1 = Bundle("书籍", 10, Book("漫画", 40),
          Bundle("文学", 20, Book("《阳关》", 80), Book("《围城》", 30)))
        println(price(sale1)) //120.0
    
        val sale2 = Book("《阳关》", 80)
        println(price(sale2)) //80.0
    
      }
    
      def price(item: Item): Double = {
        item match {
          //如果传入的是一本书  就返回一本书的价格
          case Book(_, p) => p
          //如果传入的是bundle 就返回bundle的最终计算的价格
          case Bundle(_, dis, its @ _*) => its.map(price).sum - dis // 重点自己理解下递归调用
        }
      }
    
    }
    
    
    abstract class Item //项 设计模式
    
    //样式类
    case class Book(desc: String, price: Double) extends Item
    
    //样式类
    case class Bundle(desc: String, discount: Double, item: Item*) extends Item
     
    关注公众号 海量干货等你
  • 相关阅读:
    Virtualbox + centos7 实现网络互ping
    什么?https://start.spring.io访问不了,本地搭建一个不就行了
    关系型数据库设计三大范式到底是什么?
    ClickHouse集群搭建(二)
    ClickHouse集群搭建(一)
    适合初学者入门Java程序
    ffmpeg 修改视频封面
    重温于娟对癌症的认知
    Ubuntu18.04 安装jdk1.8
    提交本地代码到github (commit to remote repo)
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734164.html
Copyright © 2020-2023  润新知