Во-первых, нам нравится избегать null
s, отсекая их как можно раньше.
val o1 = Option(/*code that retrieved/created c1*/)
val o2 = Option(/*code that retrieved/created c2*/)
Тогда код, который "манипулирует" изменяемыми переменными, является плохой идеей, но, как вы этого не сделали Мы не можем предложить лучшие решения для этой части.
val flag = o1.fold(o2.nonEmpty)(_ => o2.isEmpty) &&
//other code continues that calculates flag value