谁能告诉我如何重写这段代码以避免冗余部分?
val lineSplit = line.split(" ")
lineSplit match {
case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processLiteral(value)}
case Array(cls @ TaggedString(), prop @ TaggedString(), value @ LiteralwithSchema(), ".") => {processProperty(prop);processExtendedLiteral(value)}
case Array(cls @ TaggedString(), prop @ TaggedString(), value @ TaggedString(), ".") => {processProperty(prop);processTag(value)}
case _ => throw new IllegalArgumentException("unable to identify line format")
}
您可能已经看到具有提取属性的部分始终相同。 你有什么想法如何充分考虑这部分?
thx for your input,
的Stefan
答案 0 :(得分:1)
在你的情况下,我只是加倍匹配(虽然也可以编写一个自定义提取器)并避免重复返回一个完成工作的函数:
def badLine() = throw new IllegalArgumentException("unable to identify line format")
lineSplit match {
case Array(cls @ TaggedString(), prop @ TaggedString(), x, ".") =>
val processValue = x match {
case value: Literal() => () => processLiteral(value)
case value: LiteralwithSchema() ...
...
case _ => badLine()
}
processProperty(prop)
processValue()
case _ => badLine()
}
答案 1 :(得分:0)
val lineSplit = line.split(" ")
lineSplit match {
case Array(cls @ TaggedString(), prop @ TaggedString(), value @ Literal(), ".") => {processProperty(prop);processValue(value)}
case _ => throw new IllegalArgumentException("unable to identify line format")
}
def processValue(x: String): String = {
x match {
case Literal() => processLiteral(x)
case LiteralwithSchema() => processExtendedLiteral(x)
case TaggedString() => processTag(x)
case _ => throw new IllegalArgumentException("value has an unknown format!")
}
我决定将价值处理考虑在一个对我来说更容易的方法中。 现在看代码这个问题感觉有点尴尬现在大声笑。 }