Scala中如何仅使用for循环构建奇偶列表?
解决Scala中用for循环分离奇偶列表的问题
你原代码的核心问题是初始化List时未指定类型,var even_list = List()会被编译器推断为List[Nothing],而Nothing是所有类型的底类型,无法向其中追加Int类型元素。以下是两种仅使用for循环的可行解决方案:
方案1:修正原逻辑,指定列表类型
保持你原本的循环结构,只需为列表明确指定元素类型即可正常运行:
object LoopList extends App { var even_list: List[Int] = List() var odd_list: List[Int] = List() for (i <- Range(1, 10)) { if (i % 2 == 0) { even_list = even_list :+ i } else { odd_list = odd_list :+ i } } println(even_list) // 输出: List(2, 4, 6, 8) println(odd_list) // 输出: List(1, 3, 5, 7, 9) }
通过: List[Int]指定列表元素类型为Int,解决了类型不匹配的问题,后续追加元素的操作就能正常执行。
方案2:用for推导式实现纯不可变风格
Scala的for推导式属于for循环的扩展形式,无需使用可变变量,更贴合Scala函数式编程的设计理念:
object LoopList extends App { val range = Range(1, 10) // 生成偶数列表 val even_list = for { i <- range if i % 2 == 0 } yield i // 生成奇数列表 val odd_list = for { i <- range if i % 2 != 0 } yield i println(even_list.toList) // 输出: List(2, 4, 6, 8) println(odd_list.toList) // 输出: List(1, 3, 5, 7, 9) }
推导式中的yield会自动收集满足条件的元素,生成IndexedSeq后调用toList即可转为目标列表类型,全程使用不可变的val变量。
方案3:单循环+元组累积结果
如果希望用一个for循环同时完成两个列表的收集,可结合元组封装最终结果:
object LoopList extends App { val (even_list, odd_list) = { var evens: List[Int] = List() var odds: List[Int] = List() for (i <- Range(1, 10)) { if (i % 2 == 0) evens = evens :+ i else odds = odds :+ i } (evens, odds) } println(even_list) // 输出: List(2, 4, 6, 8) println(odd_list) // 输出: List(1, 3, 5, 7, 9) }
该方案将可变变量的作用域限制在代码块内,避免全局可变状态,同时用一个循环完成所有元素的分类。
内容的提问来源于stack exchange,提问作者harsh sharma
相关产品推荐
相关产品推荐

