【发布时间】:2019-10-29 01:46:15
【问题描述】:
我正在使用一些 3rd 方库编写一个 Scala 应用程序。当迭代该库中的集合时,会发生异常,我想忽略它,然后继续迭代。整个事情都在一个带有 yield 的 for 循环中。
val myFuntionalSequence = for {
mailing <- mailingCollection
} yield (mailing.getName, mailing.getSubject)
如前所述,错误发生在迭代内部,所以这一行:
mailing <- mailingCollection
如果我在整个循环中放置一个 try catch,那么我将无法继续迭代。我有一个非功能性解决方案具有与上述相同的输出,但我想让整个应用程序保持功能性风格。这是我想出的一种非功能性方式:
case class MyElement(name: String, subject: String)
...
var myNonFunctionalList = scala.collection.mutable.ListBuffer[MyElement]()
while(mailingIterator.hasNext) {
try {
val mailing = mailingIterator.next()
myNonFunctionalList += MyElement(mailing.getName, mailing.getSubject)
} catch {
case e: Exception => println("Error")
}
}
我的问题是,您是否知道一种尝试迭代 for 循环并在出错时跳过该元素并仅返回迭代有效的元素的功能方法?
谢谢, 费利克斯
【问题讨论】:
-
什么是mailingCollection?如果它只是一个集合,则不能在该行中引发错误(除非它是您自己的集合,它会在
map上引发错误。也许getName或getSubject会引发异常? -
嘿 Krzysztof,mailingCollection 是来自该外部库的一个类的对象。所以我认为实际的错误在于他们的迭代实现。但我只想跳过那个错误。
-
mailingCollection大吗?您需要懒惰地处理它,还是可以将其加载到列表中?你能分享mailingCollection的类型吗? -
我不确定如何“跳过”迭代。我的意思是,我想如果你从迭代器中得到一个异常,你不能再调用
.next现在得到一个元素,不是吗?也许您所说的“继续迭代”只是指在不引发异常的情况下处理错误?
标签: scala for-loop try-catch yield