2017-07-13 41 views
2

我想造成这种斯卡拉名单:如何创建的方法列表和类型斯卡拉

List(("Att1", getAtt1(), Int), 
    ("Att2", getAtt2(), BigDecimal), 
    ("Att3", getAtt3(), Long)) 

getAtt1,getAtt2和getAtt3来自斯卡拉进口的Java对象。我使用列表的第三个参数来知道转换。例如,getAtt3()返回一个Int,我的List告诉我需要将它转换为Long。

我使用Scala 2.11.8。

你有什么想法吗?

+0

这是一个很好的候选人案例类没有? –

+0

事实上,但我怎样才能在我的案例类字段中放置一个方法? –

+1

@ a.moussa你可以使用函数类型: 'case class Conv(name:String,get:()=> Int,convert:Int => Long)' –

回答

2

你的确可以像评论中提到的那样使用一个类来解决这个问题。我会去参加一个有2种参数和转换方法的课程。事情是这样的:

> case class Attribute[Original, Target](name: String, value:() => Original)(converter: Original => Target) { 
    def convert = converter(value()) 
    } 
defined class Attribute 

> Attribute("three",() => 3)(_.toLong).convert 
res11: Long = 3L 

请注意我已经分离的情况类的converter参数到它自己的参数块。这是Scala常用于帮助类型推断的技巧。现在您可以将IntLong之间的转换定义为_.toLong。如果您将converter放入同一参数块中,则必须在创建实例时指定完整类型签名:Attribute("",() => 3, (i: Int) => i.toLong)

+0

非常有帮助,这正是我所寻找的: ) –