zoukankan      html  css  js  c++  java
  • 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
     
    关注公众号 海量干货等你
  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734164.html
Copyright © 2011-2022 走看看