Scala递归函数else if返回单位
Noob Scala问题: 我有以下代码摘录:Scala递归函数else if返回单位,scala,tail-recursion,Scala,Tail Recursion,Noob Scala问题: 我有以下代码摘录: @tailrec def buildObjectFromFile(dataList: List[String], fileObject: IncomingFile): IncomingFile = { dataList match { case Nil => fileObject case data :: list => val recordIdentifier = data.substring(0,
@tailrec
def buildObjectFromFile(dataList: List[String], fileObject: IncomingFile): IncomingFile = {
dataList match {
case Nil => fileObject
case data :: list =>
val recordIdentifier = data.substring(0, 2)
if (recordIdentifier.equals("00")) {
val fileHeader = new fFileHeader(
...
)
buildObjectFromFile(list, new IncomingFile(fileHeader, fileObject.accountsList, fileObject.fileTrailer))
} else if (recordIdentifier.equals("01")) {
val accountHeader = new AccountHeader(
...
)
fileObject.accountsList += new Account(data.substring(12, 22), accountHeader, null, null, null)
buildObjectFromFile(list, new IncomingFile(fileObject.fileHeader, fileObject.accountsList, fileObject.fileTrailer))
} else if (recordIdentifier.equals("99")) { // <--- Problematic
val fileTrailer = new FileTrailer(
...
)
buildObjectFromFile(list, new IncomingFile(fileObject.fileHeader, fileObject.accountsList, fileTrailer))
}
}
}
@tailrec
def buildObjectFromFile(数据列表:列表[String],文件对象:IncomingFile):IncomingFile={
数据表匹配{
case Nil=>fileObject
案例数据::列表=>
val recordIdentifier=data.substring(0,2)
if(recordIdentifier.equals(“00”)){
val fileHeader=新的fFileHeader(
...
)
buildObjectFromFile(列表,新收入文件(文件头,文件对象.accountsList,文件对象.fileTrailer))
}else if(recordIdentifier.equals(“01”)){
val accountHeader=新accountHeader(
...
)
fileObject.accountsList+=新帐户(data.substring(12,22),accountHeader,null,null)
buildObjectFromFile(列表,新收入文件(fileObject.fileHeader,fileObject.accountsList,fileObject.FileTraile))
}else if(recordIdentifier.equals(“99”)){/您可以通过为整个if-else-if表达式实现else来修复。现在您没有它,所以整个块具有单位类型是来自buildObjectFromFile
的返回类型正确,即IncomingFile
?此外,您可能应该添加一个else
块,否则retrun值将是AnyVal
使dataList
测试if
..else
,然后在数据上执行模式匹配
。子字符串(0,2)
。即使没有默认值(即finalelse
),逻辑也更易于阅读/遵循,结果类型也一致。首先添加else块。