Вопрос по scala, enumeration – Заметьте, у меня недостаточно представителей, чтобы комментировать пост Дебильски.

20

у сервлет, и мне нужно получить все параметры из запроса. я нашелrequest.getParameterNames возвращаетjava.util.Enumerationпоэтому я должен написать код как:

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

Я хочу знать, есть ли способ преобразоватьEnumeration кSeq/Listтогда я могу использоватьmap метод?

Ваш Ответ

4   ответа
0

что подход Iterator.continual неправильный, поскольку он пропускает последнюю запись. Вот мой тест:

val list = new java.util.ArrayList[String]
list.add("hello")
list.add("world")
val en = java.util.Collections.enumeration(list)
val names = Iterator.continually((en, en.nextElement)).takeWhile(_._1.hasMoreElements).map(_._2)
    .foreach { name => println("name=" + name) }

Выход

name=hello

Второй элемент (имя = мир) отсутствует!

Я получил это, чтобы работать с помощью JavaConversions.enumerationAsScalaIterator, как упомянуто другими.

Заметьте, у меня недостаточно представителей, чтобы комментировать пост Дебильски.

27

как это

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

Iterator.continually выполняетпо имени позвонить на(names, names.nextElement) который на каждом шаге возвращает исходное перечисление и следующий элемент. Условие остановки, конечно, вtakeWhile и потому что нам не нужно проходить счет навсегда, мыmap только значения.

В качестве альтернативы вы можете создать оболочку:

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

Или, наконец, и это встроенный метод и, вероятно, тот, который используется в этом случае:

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

Использование последствий:

У меня есть еще один. Если вы импортируете

import scala.collection.JavaConversions._

вы можете сделать это неявно (и вы также получите неявные преобразования для других собраний Java)

request.getParameterNames.map(println)

и это просто работает.

Я думаю, что первый код содержит ошибку: он не возвращает самый последний элемент. Чтобы получить его, вы должны сделать что-то вродеval nameIterator = Iterator.continually((names.hasMoreElements, names)).takeWhile(_._1).map(_._2.nextElement) SergGr
Обратите внимание, чтоJavaConversions не рекомендуется. Смотри ответ Кевина Райта. Kelvin
0

но мне пришлось добавить приведение типов для компиляции в Scala 2.9.2 и Java 7.

import scala.collection.JavaConversions._
...
val names=request.getParameterNames.asInstanceOf[java.util.Enumeration[String]].toSet
26

scala.collection.JavaConverters

Скаладок здесь

Этот класс отличается отJavaConversions немного, в том, что преобразования не полностью автоматические, что дает вам больше контроля(Это хорошая вещь):

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

Используя этот механизм, вы получите подходящие и безопасные для типов преобразования для большинства типов коллекций черезasScala/asJava методы.

@ Боже, ты сделалimport? Вам это нужно для того, чтобы получить последствия. Kelvin
asScala не работает для меня по какой-то причине. я использовалenumerationAsScalaIterator(enumeration). Mygod
Смотрит сейчас нужноimport scala.collection.JavaConverters._ danio

Похожие вопросы