scala - 如何在Scala中将枚举转换为Seq/List?

标签 scala enumeration

我正在编写一个 servlet,需要从请求中获取所有参数。我找到了 request.getParameterNames返回 java.util.Enumeration ,所以我必须将代码编写为:

val names = request.getParameterNames
while(names.hasMoreElements) {
    val name = names.nextElement
}

我想知道有什么方法可以转换 EnumerationSeq/List ,然后我可以使用 map方法?

最佳答案

使用 JavaConverters

https://stackoverflow.com/a/5184386/133106

使用包装迭代器

你可以建立一个包装器:

val nameIterator = new Iterator[SomeType] { def hasNext = names.hasMoreElements; def next = names.nextElement }

使用 JavaConversions 包装器
val nameIterator = new scala.collection.JavaConversions.JEnumerationWrapper(names)

使用 JavaConversions 隐式

如果你导入
import scala.collection.JavaConversions._

您可以隐式地进行(并且您还将获得其他 Java 集合的隐式转换)
request.getParameterNames.map(println)

使用 Iterator.continually

您可能想使用 Iterator.continually 构建迭代器就像这个答案的早期版本提出的那样:
val nameIterator = Iterator.continually((names, names.nextElement)).takeWhile(_._1.hasMoreElements).map(_._2)

但这是不正确的,因为枚举器的最后一个元素将被丢弃。
原因是hasMoreElement调用 takeWhile调用 nextElement 后执行在 continually ,从而丢弃最后一个值。

关于scala - 如何在Scala中将枚举转换为Seq/List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183730/

相关文章:

java - 更新错误 :org. elasticsearch.ElasticsearchIllegalArgumentException:执行脚本失败

java - Scala/Java 互操作的静态嵌套类可见性问题

scala - 覆盖类型边界时出现不兼容的类型错误

另一个文件中可能值的 XML 模式枚举

c++ - 如何解决编译器枚举重新声明冲突

c# - 集合被修改;枚举操作可能无法执行 - 为什么?

scala - 为什么Scala中的Final变量可以更改值

scala - Spark build.sbt 文件版本控制

web-services - 使用 ColdFusion 的 .net Web 服务时出现问题

xml - 如何将 XmlProvider<...>.DomainTypes 自动提供的选择类型转换为 F# 中的枚举?