如何从CSV / Map实例化Scala对象

时间:2015-08-03 16:32:01

标签: java scala class csv

我目前正在研究一些Scala脚本。我有一个带有一些Java类的依赖库。

一个类看起来像这样:

public class Animal {
   protected String name;
   protected String animalBreed;

   public String getName() {
      return this.name;
   }

   public void setName(String value) {
      this.name = value;
   }

   public String getAnimalBreed() {
      return this.animalBreed;
   }

   public void setAnimalBreed(String value) {
      this.animalBreed = value;
   }
}

我有一些CSV输入文件,不一定包含该类的所有字段,可能还有其他一些未定义的字段。

例如:

name,age
Spyke,2

我已经有一些代码可以将CSV转换为Map[String,String]。但我正在寻找一种方法来动态地实例化我的Animal类。动态地,我的意思是自动设置可用字段并跳过其他字段。在这种情况下,它将创建一个名为但没有品种且没有年龄的新Animal对象。

我真的不知道Scala中是否可以使用,或者哪个关键词可以帮助我进行Google搜索 - 任何帮助都表示赞赏!

2 个答案:

答案 0 :(得分:0)

此Scala方法可以使用Animal中的字段创建Map[String,String] Java类的新实例。

  def createAnimal(fields: Map[String, String]): Animal =
    fields.foldLeft(new Animal) {
      (animal, field) => field._1 match {
        case "name" =>
          animal.setName(field._2)
        case "animalBreed" =>
          animal.setAnimalBreed(field._2)
        case _ =>
      }
      animal
    }

答案 1 :(得分:0)

import com.github.marklister.collections.io._
import com.github.marklister.collections._
Welcome to Scala version 2.11.6 (OpenJDK Server VM, Java 1.7.0_79).
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class Animal (age: Option[Int], name:  Option[String],breed: Option[String])
defined class Animal

scala> val csv="""15,Cecil,Lion
     | 5,,Pangolin
     | n/a,Kermit,Frog"""
csv: String =
15,Cecil,Lion
5,,Pangolin
n/a,Kermit,Frog

scala> CsvParser(Animal).parse(new java.io.StringReader(csv))
res0: Seq[Animal] = List(Animal(Some(15),Some(Cecil),Some(Lion)), Animal(Some(5),None,Some(Pangolin)), Animal(None,Some(Kermit),Some(Frog)))

product-collections。很简单吧?