You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:40:32