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