我目前正在研究一些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搜索 - 任何帮助都表示赞赏!
答案 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。很简单吧?