mkString优化以及超过22字段在scala2.10中的一个小需求
来源:互联网 发布:电脑绘画软件 编辑:程序博客网 时间:2024/06/07 20:31
背景
今天一个朋友让我给优化一段代码,他设计了一个很庞大的类,有40个字段,由于22 limit的缘故,他实现了Product特质,并且实现了那些方法,可是他在重写toString的时候写的很java,于是我们进行了一下优化:
override def toString = { val sb = new StringBuilder("MkStringInClass:[") for (i ← 0 until productArity) { if (i > 0) sb.append(",") sb.append(productElement(i) match { case Some(x) ⇒ x case t ⇒ t }) } sb.append("]") sb.toString }
原方法很java,用一个StringBuider在实现一个拼接,我觉得可以用mkString,所以进行了改进:
override def toString = s"${ (for (i ← 0 until productArity) yield productElement(i) match { case Some(t) ⇒ t case t ⇒ t }).mkString("MakeStringClass:[", ",", "]") }"
这样看起来清爽多了,主要就是用mkString去做了原来StringBuffer干的活
def mkString(start : scala.Predef.String, sep : scala.Predef.String, end : scala.Predef.String) : scala.Predef.String = { /* compiled code */ } def mkString(sep : scala.Predef.String) : scala.Predef.String = { /* compiled code */ } def mkString : scala.Predef.String = { /* compiled code */ }
完整代码:
package com.linewell.otherimport scala.util.{Failure, Success, Try}/** * Created by ctao on 16-2-25. */class MakeStringInClass( id: Int, name: String, age: Int, location: Option[String] ) extends Product with Serializable { override def productElement(n: Int): Any = n match { case 0 ⇒ id case 1 ⇒ name case 2 ⇒ age case 3 ⇒ location case _ ⇒ throw new IndexOutOfBoundsException(n.toString) } override def productArity: Int = 4 override def canEqual(that: Any): Boolean = that.isInstanceOf[MakeStringInClass] override def toString = s"${ (for (i ← 0 until productArity) yield productElement(i) match { case Some(t) ⇒ t case t ⇒ t }).mkString("MakeStringClass:[", ",", "]") }"/* override def toString = { val sb = new StringBuilder("MkStringInClass:[") for (i ← 0 until productArity) { if (i > 0) sb.append(",") sb.append(productElement(i) match { case Some(x) ⇒ x case t ⇒ t }) } sb.append("]") sb.toString }*/}object MakeStringInClass { def apply(str: String): Option[MakeStringInClass] = { val params = str.split(" ") Try { new MakeStringInClass(params(0).toInt, params(1), params(2).toInt, Some(params(3))) } match { case Success(x) ⇒ Some(x) case Failure(e) ⇒ None } }}
我这边就只是写了几个字段意思了下,哈哈
他的源代码:
package xxx.xx.xxxclass Order(val id: Option[String]=None ,val orderId: Option[String]=None ,val tradeId: Option[String]=None ,val platformCode: Option[String]=None , val platformName: Option[String]=None ,val orderType: Option[String]=None ,val storeCode: Option[String]=None ,val storeName: Option[String]=None , val tradeFrom: Option[String]=None ,val createdAt: Option[String]=None ,val paymentAt: Option[String]=None , val deliveryAt: Option[String]=None , val finishedAt: Option[String]=None ,val isCod: Option[Char]=None , val isInvoice: Option[Char]=None ,val price: Option[Double]=None , val payment: Option[Double]=None ,val quantity: Option[Int]=None ,val promotion: Option[Double]=None ,val expressFee: Option[Double]=None , val orderStatus: Option[String]=None ,val omsOrderStatus: Option[String]=None ,val deliveryStatus: Option[String]=None , val isOutOfStock: Option[Char]=None , val isBag: Option[Char]=None ,val bagDescription: Option[String]=None ,val buyerAccount: Option[String]=None , val buyerNick: Option[String]=None , val buyerEmail: Option[String]=None ,val buyerMessage: Option[String]=None ,val consignee: Option[String]=None , val mobile: Option[String]=None , val address: Option[String]=None ,val fullAddress: Option[String]=None ,val sellerNick: Option[String]=None ,val sellerMessage: Option[String]=None , val refuseReason: Option[String]=None ,val refundStatus: Option[String]=None ,val refundFinished: Option[String]=None)extends Product with Serializable{ override def canEqual(that: Any): Boolean = that.isInstanceOf[Order] override def productArity: Int = 39 override def toString(): String ={ s"Order[${(for(i<- 0 until productArity) yield productElement(i) match{case Some(x)=>x case t=>t}).mkString(",")}]" } @throws(classOf[IndexOutOfBoundsException]) override def productElement(n: Int) = n match { case 0 => id case 1 => orderId case 2 => tradeId case 3 => platformCode case 4 => platformName case 5 => orderType case 6 => storeCode case 7 => storeName case 8 => tradeFrom case 9 => createdAt case 10 => paymentAt case 11 => deliveryAt case 12 => finishedAt case 13 => isCod case 14 => isInvoice case 15 => price case 16 => payment case 17 => quantity case 18 => promotion case 19 => expressFee case 20 => orderStatus case 21 => omsOrderStatus case 22 => deliveryStatus case 23 => isOutOfStock case 24 => isBag case 25 => bagDescription case 26 => buyerAccount case 27 => buyerNick case 28 => buyerEmail case 29 => buyerMessage case 30 => consignee case 31 => mobile case 32 => address case 33 => fullAddress case 34 => sellerNick case 35 => sellerMessage case 36 => refuseReason case 37 => refundStatus case 38 => refundFinished case _ => throw new IndexOutOfBoundsException(n.toString()) }}
my github
0 0
- mkString优化以及超过22字段在scala2.10中的一个小需求
- scala2
- java中的反射以及一个小问题
- mysql中的升序和降序以及一个字段升序和一个字段降序
- 曾经做的一个需求:如果一个应用在后台运行超过三小时,系统自动杀掉这个应用 以释放内存 来达到内存优化的目的
- 一个附言字段需求的总结
- 矩阵在编程中的一个小应用
- ArrayList应用中的一个小问题以及解决方法
- mysql中如何将查询结果的多个记录中的指定字段放到一个二维数组中,以及在in子句中使用数组
- 如何判断一个表以及一个表中的字段是否存在
- sql server 查询一个表中的字段是否包含在另一个表的字段中
- hibernate字段中的小问题
- 数据库优化-垂直切分以及在实际项目中的应用
- 数据库优化-水平切分-以及在实际项目中的应用
- 小需求:查询mapping对应的表及字段
- 利用pandas实现一个小需求
- sql判断一个表是否存在 以及表中的字段是否存在
- “支配着” 是在数组中出现频率超过一半的整数,求一个数组中的支配者
- 史上最全的CSS hack方式一览
- 深夜学网页(2)——html(2)
- 开本博客的目的
- HDU 1171 Big Event in HDU(多重背包)
- IE8 添加class (兼容)方法
- mkString优化以及超过22字段在scala2.10中的一个小需求
- UVA 524(p194)----Prime Ring Problem
- React Native学习笔记-4:CSS优先级速记
- Linux添加头文件路径
- 用通俗易懂的大白话讲解Map/Reduce原理
- leetcode-102-Binary Tree Level Order Traversal
- iOS 设计模式 - 命令模式
- 文献笔记:《Can we still avoid automatic face detection?》读后感~
- 这一年,我们一起追过的梦想