Как правило, вы пытаетесь избежать таких ситуаций, начиная с фильтрации, прежде чем даже начинать:
val goodStocks = allStocks.view.
map(stock => (stock, stock.getQuote)).filter(_._2 != null).
map { case (stock, quote) => (stock,quote, quote.getPrice) }.filter(_._3 != null)
(в этом примере показано, как вы будете получать частичные результаты, если они вам нужны).Я использовал представление, чтобы результаты вычислялись по мере необходимости, а не создавали кучу новых коллекций на каждом шаге.
На самом деле, у вас, вероятно, есть кавычки и такие параметры возврата - смотритев StackOverflow приведены примеры того, как использовать их вместо возвращаемых значений NULL.
Но, в любом случае, если такие вещи не работают так хорошо (например, потому что вы генерируете слишком много промежуточных результатов, которые вам нужнысохранить, или вы полагаетесь на обновление изменяемых переменных, и вы хотите, чтобы шаблон оценки был простым, чтобы вы знали, что происходит, когда) и вы не можете представить себе проблему по-другому, возможно, более надежным способом, чем вы можете
import scala.util.control.Breaks._
for (stock <- allStocks) {
breakable {
val quote = getQuote(...)
if (quoteLast eq null) break;
...
}
}
Конструкция breakable
указывает, куда вас должны привести разрывы.Если вы помещаете breakable вне цикла for, он работает как стандартный разрыв в стиле Java.Если вы поместите его внутрь, он будет действовать как continue
.
Конечно, если у вас очень мало условий, вам вообще не нужно продолжать;просто используйте остальную часть оператора if.