如何从scala中的列表列表填充用户定义的对象

如何从scala中的列表列表填充用户定义的对象,scala,Scala,我是斯卡拉的新手 当前正在尝试编写一个程序,以以下格式从数据库中获取表元数据作为列表列表,并将其转换为用户定义类型的对象TableFieldMetadata 函数执行此转换 你能告诉我,我是否能用函数的方式更好地编写这个函数吗 | **Table Name** | **FieldName** | **Data type** | | table xxxxxx | field yyyyyy | type zzzz | | table xxxxxx | field wwwww| type m

我是斯卡拉的新手

当前正在尝试编写一个程序,以以下格式从数据库中获取表元数据作为列表列表,并将其转换为用户定义类型的对象
TableFieldMetadata

函数执行此转换

你能告诉我,我是否能用函数的方式更好地编写这个函数吗

| **Table Name** | **FieldName** | **Data type** |

| table xxxxxx  | field yyyyyy  | type zzzz |

| table xxxxxx  | field wwwww| type mmm|

| table qqqqqq| field nnnnnn| type zzzz |
注意:这里的表名可以重复,因为它通常有多个列

用户定义类: 1.TableFieldMetadata:

/**
 * Class to hold the meta data for a table
 */ 
class TableFieldMetadata (name: String){
  var tableName: String = name
  var fieldMetaDataList: List[FieldMetaData] = List()

 def add(fieldMetadata: FieldMetaData) {
    fieldMetaDataList = fieldMetadata :: fieldMetaDataList 
 }
}
二,。字段元数据:

/**
 * Class to hold the meta data for a field
 */
class FieldMetaData (fieldName: String, fieldsDataType: String) {
    var name:String = fieldName
    var dataType:String = fieldsDataType
}
功能:

/**
 * Function to convert list of lists to user defined objects
 */
def getAllTableMetaDataAsVO(allTableMetaData: List[List[String]]):List[TableFieldMetadata] = {
  var currentTableName:String = null
  var currentTable: TableFieldMetadata = null;
  var tableFieldMetadataList: List[TableFieldMetadata] = List()

  allTableMetaData.foreach { tableFieldMetadataItem =>
    var tableName = tableFieldMetadataItem.head
    if (currentTableName == null || !currentTableName.equals(tableName)) {
      currentTableName = tableName
      currentTable = new TableFieldMetadata(tableName)
      tableFieldMetadataList = currentTable :: tableFieldMetadataList
    }
    if (currentTableName.equals(tableName)) {
      var tableField = tableFieldMetadataItem.tail
      currentTable.add(new FieldMetaData(tableField(0), tableField(1)))
    }    

  }
  return tableFieldMetadataList
}

这里有一个解决方案。注意:我刚才使用了
字段
,以便于在REPL中键入内容。您应该使用case类

scala> case class Field( name: String, dType : String) 
defined class Field

scala> case class Table(name : String, fields : List[Field])
defined class Table

scala> val rawData = List( List("table1", "field1", "string"), List("table1", "field2", "int"), List("table2", "field1", "string") )
rawData: List[List[String]] = List(List(table1, field1, string), List(table1, field2, int), List(table2, field1, string))

scala> val grouped = rawData.groupBy(_.head)
grouped: scala.collection.immutable.Map[String,List[List[String]]] = Map(table1 -> List(List(table1, field1, string), List(table1, field2, int)), table2 -> List(List(table2, field1, string)))

scala> val result = grouped.map { case(k,v) => { val fields = for { r <- v } yield { Field( r(1), r(2) ) }; Table( k, fields ) } } 
result: scala.collection.immutable.Iterable[Table] = List(Table(table1,List(Field(field1,string), Field(field2,int))), Table(table2,List(Field(field1,string))))
scala>案例类字段(名称:String,数据类型:String)
定义类字段
scala>案例类表(名称:字符串,字段:列表[字段])
定义类表
scala>val rawData=List(List(“table1”、“field1”、“string”)、List(“table1”、“field2”、“int”)、List(“table2”、“field1”、“string”))
rawData:List[List[String]=List(List(表1,字段1,字符串),List(表1,字段2,int),List(表2,字段1,字符串))
scala>val grouped=rawData.groupBy(u.head)
分组:scala.collection.immutable.Map[String,List[List[String]]]=Map(table1->List(List(table1,field1,String),List(table1,field2,int)),table2->List(List(table2,field1,String)))

scala>val result=grouped.map{case(k,v)=>{val fields=for{r非常感谢。这是我正在寻找的东西。