Fre*_*ind 22 enumeration scala
我正在编写一个servlet,需要从请求中获取所有参数.我发现request.getParameterNames返回a java.util.Enumeration,所以我必须编写代码:
val names = request.getParameterNames
while(names.hasMoreElements) {
val name = names.nextElement
}
Run Code Online (Sandbox Code Playgroud)
我想知道有没有办法将a转换Enumeration为a Seq/List,那么我可以使用该map方法吗?
Deb*_*ski 29
你可以像这样自己构建它
val nameIterator = Iterator.continually((names, names.nextElement)).takeWhile(_._1.hasMoreElements).map(_._2)
Run Code Online (Sandbox Code Playgroud)
Iterator.continually执行一个名字调用(names, names.nextElement),在每个步骤返回原始枚举和下一个元素.停止条件当然是takeWhile因为我们不需要永远传递枚举,我们map只有值.
或者,您可以构建一个包装器:
val nameIterator = new Iterator[SomeType] { def hasNext = names.hasMoreElements; def next = names.nextElement }
Run Code Online (Sandbox Code Playgroud)
或者,最后,这是内置方法,可能是在这种情况下使用的方法:
val nameIterator = new scala.collection.JavaConversions.JEnumerationWrapper(names)
Run Code Online (Sandbox Code Playgroud)
使用Implicits:
我还有一个.如果你导入
import scala.collection.JavaConversions._
Run Code Online (Sandbox Code Playgroud)
你可以隐式地做(并且你也会得到其他Java集合的隐式转换)
request.getParameterNames.map(println)
Run Code Online (Sandbox Code Playgroud)
它只是有效.
Kev*_*ght 28
目前的最佳实践(自2.8.1起)即可使用 scala.collection.JavaConverters
这个类JavaConversions略有不同,因为转换不是完全自动的,为您提供更多控制(这是一件好事):
import collection.JavaConverters._
val names = ...
val nameIterator = names.asScala
Run Code Online (Sandbox Code Playgroud)
使用此机制,您将通过这些asScala/asJava方法为大多数集合类型获得适当的类型安全转换.
| 归档时间: |
|
| 查看次数: |
9243 次 |
| 最近记录: |