Scala代码为何输出List((), (), (), ())而非预期的List(2,4)?
问题原因分析
你的Scala代码出现这个问题的核心原因是Scala的if是表达式而非语句,必须有明确的返回值:
- 当
i3为奇数时,if (i3 % 2 == 0)没有对应的else分支,Scala会自动补全else (),也就是返回Unit类型的()。 - for推导式的
yield会收集每一次循环的执行结果,4次循环后会生成包含两个()和两个数字的集合(实际应为List((), 2, (), 4),你看到的全()可能是输出时的误判)。
正确写法
要得到预期的List(2,4),最简洁的方式是在for推导式中使用守卫条件,直接过滤掉不满足条件的元素:
val ans1 = for(i3 <- 1 to 4 if i3 % 2 == 0) yield i3
这样推导式只会遍历符合条件的i3,最终收集到的就是List(2,4)。
也可以给if补充else分支,返回None后再扁平化,但守卫写法更直观高效:
val ans1 = (for(i3 <- 1 to 4) yield { if (i3 % 2 == 0) Some(i3) else None }).flatten
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

