Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert Enumeration to Seq/List in scala?

Tags:

I'm writing a servlet, and need to get all parameters from the request. I found request.getParameterNames returns a java.util.Enumeration, so I have to write code as:

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

I wanna know is there any way to convert a Enumeration to a Seq/List, then I can use the map method?

like image 624
Freewind Avatar asked Mar 03 '11 16:03

Freewind


2 Answers

Use JavaConverters

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

Use a wrapper Iterator

You could build up a wrapper:

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

Use JavaConversions wrapper

val nameIterator = new scala.collection.JavaConversions.JEnumerationWrapper(names) 

Using JavaConversions implicits

If you import

import scala.collection.JavaConversions._ 

you can do it implicitly (and you’ll also get implicit conversions for other Java collecitons)

request.getParameterNames.map(println) 

Use Iterator.continually

You might be tempted to build an iterator using Iterator.continually like an earlier version of this answer proposed:

val nameIterator = Iterator.continually((names, names.nextElement)).takeWhile(_._1.hasMoreElements).map(_._2) 

but it's incorrect as the last element of the enumerator will be discarded. The reason is that the hasMoreElement call in the takeWhile is executed after calling nextElement in the continually, thus discarding the last value.

like image 77
Debilski Avatar answered Sep 18 '22 12:09

Debilski


Current best practice (since 2.8.1) is to use scala.collection.JavaConverters

  • Scaladoc here

This class differs from JavaConversions slightly, in that the conversions are not fully automatic, giving you more control (this is a good thing):

import collection.JavaConverters._ val names = ... val nameIterator = names.asScala 

Using this mechanism, you'll get appropriate and type-safe conversions for most collection types via the asScala/asJava methods.

like image 40
Kevin Wright Avatar answered Sep 22 '22 12:09

Kevin Wright