Scala 如何从列表[字符串]创建案例类?

Scala 如何从列表[字符串]创建案例类?,scala,Scala,这是我的密码 scala> s res6: String = 2005-05-06 14:58:56 192 45.14.5.238 200 TCP_NC_MISS 1123 496 GET http c4.maxserving.com /gen.js ?site=5835&area=side_ros&group=sidebar&PageID=33364329499 - DIRECT c4.maxserving.com application/x-javascrip

这是我的密码

scala> s
res6: String = 2005-05-06 14:58:56 192 45.14.5.238 200 TCP_NC_MISS 1123 496 GET http c4.maxserving.com /gen.js ?site=5835&area=side_ros&group=sidebar&PageID=33364329499 - DIRECT c4.maxserving.com application/x-javascript "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" PROXIED Web%20Advertisements - 192.16.170.44 SG-HTTP-Service - none -

scala> s.split("\\s")
res7: Array[String] = Array(2005-05-06, 14:58:56, 192, 45.14.5.238, 200, TCP_NC_MISS, 1123, 496, GET, http, c4.maxserving.com, /gen.js, ?site=5835&area=side_ros&group=sidebar&PageID=33364329499, -, DIRECT, c4.maxserving.com, application/x-javascript, "Mozilla/4.0, (compatible;, MSIE, 6.0;, Windows, NT, 5.1;, SV1;, .NET, CLR, 1.1.4322)", PROXIED, Web%20Advertisements, -, 192.16.170.44, SG-HTTP-Service, -, none, -)

scala> case class BlueCoatEvent(date: String,
     |                          time: String,
     |                          timeTaken: String,
     |                          cIp: String,
     |                          scStatus: String,
     |                          sAction: String,
     |                          scBytes: String,
     |                          csBytes: String,
     |                          csMethod: String,
     |                          csUriScheme: String,
     |                          csHost: String,
     |                          csUriPath: String,
     |                          csUriQuery: String,
     |                          csUsername: String,
     |                          sHierarchy: String,
     |                          sSupplierName: String,
     |                          rsContentType: String,
     |                          csUserAgent: String,
     |                          scFilterResult: String,
     |                          scFilterCategory: String,
     |                          xVirusId: String,
     |                          sIp: String,
     |                          sSiteName: String,
     |                          xVirusDetails: String,
     |                          xIcapErrorCode: String,
     |                          xIcapErrorDetails: String)
defined class BlueCoatEvent

scala> 

如何从
s.split(“\\s”)
创建
blueCoatEvent

最可怕的方式是:

scala>   case class A(x: String, y: String, z: String)
defined class A

scala>   def toTuple[A <: Object](as:List[A]):Product = {
     |     val tupleClass = Class.forName("scala.Tuple" + as.size)
     |     tupleClass.getConstructors.apply(0).newInstance(as:_*).asInstanceOf[Product]
     |   }
toTuple: [A <: Object](as: List[A])Product

scala>   val l = List("a", "b", "c")
l: List[String] = List(a, b, c)

scala>   val t3 = toTuple(l).asInstanceOf[Tuple3[String, String, String]]
t3: (String, String, String) = (a,b,c)

scala>   val f = A.tupled
f: ((String, String, String)) => A = <function1>

scala>   f(t3)
res0: A = A(a,b,c)
同样的问题是,除非您采用不安全的方式或某种代码生成方式,否则您无法避免拼写类型,无论这些类型是
Tuple
还是
HList

  • 请参阅中的答案

  • 介绍有意义的子类型/案例类,并用它们组成
    BlueCoatEvent


  • 通过在事件值上定义
    映射[String,String]
    的不同方法;让

    case class EventMap( data: Map[String,String])
    

    然后从

    EventMap( fields(BlueCoatEvent) zip s.split("\\s") toMap )
    

    我们可以获取给定stringisized
    BlueCoateEvent

    的值属性,使用有意义的类型将使您的生活更好,我保证。谢谢@TravisBrown,我支持,我将更改它们的名称,看起来其中有几组是相关的。可能这些都应该有自己的case类,而blueCoatEvent由它们中的一个+剩余的部分组成
    def fields(cc: Product) = cc.getClass.getDeclaredFields.map(_.getName)
    
    EventMap( fields(BlueCoatEvent) zip s.split("\\s") toMap )