2011-03-03 5 views
20

서블릿을 작성 중이며 요청에서 모든 매개 변수를 가져와야합니다. 나는 request.getParameterNamesjava.util.Enumeration 반환 발견, 그래서 같은 코드를 작성해야합니다 : 그때는 map 방법을 사용할 수 있습니다하는 Seq/List에 내가 알고 싶어열거 형을 스칼라에서 Seq/List로 변환하는 방법은 무엇입니까?

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

Enumeration을 변환 할 수있는 방법이 있습니까?

답변

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) 

Implicits 사용 :

하나 더 있습니다. 당신이

import scala.collection.JavaConversions._ 

을 가져 오는 경우 당신은 암시 적으로 그것을 할 수 있습니다 (당신은 다른 자바 collecitons에 대한 암시 적 변환을거야)

request.getParameterNames.map(println) 

하고 그냥 작동합니다. (2.8.1 이후)

+0

첫 번째 코드에는 버그가 포함되어 있다고 생각합니다. 마지막 요소를 반환하지 않습니다. 그것을 얻으려면'val nameIterator = Iterator.continually ((names.hasMoreElements, names))와 같은 것을해야합니다. takeWhile (_._ 1) .map (_._ 2.nextElement)' – SergGr

+0

'JavaConversions'는 더 이상 사용되지 않습니다. Kevin Wright의 대답을 참조하십시오. – Kelvin

23

현재 가장 좋은 방법은이 클래스는, 약간 JavaConversions과 다른 점에서 변환이 당신에게 더 많은 컨트롤을 제공, 완전 자동 없습니다 scala.collection.JavaConverters

을 사용하는 것입니다 (이것은 좋은 일이) :

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

이 메커니즘을 사용하면 asScala/asJava 메서드를 통해 대부분의 컬렉션 유형에 대해 적절하고 형식이 안전한 변환을 얻습니다.

+0

'asScala'는 어떤 이유로 나를 위해 작동하지 않았습니다. 나는'enumerationAsScalaIterator (enumeration)'을 사용했다. – Mygod

+0

@Mygod 당신은'수입'을 했습니까? 암시를 얻기 위해서는 당신이 그것을 필요로합니다. – Kelvin

0

7

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

Debilski의 대답에 코멘트를 나는 다른 답변의에 동의하지 않지만 나는이 스칼라 2.9.2에서 컴파일 얻을 수있는 유형 캐스트를 추가했다 및 Java 그 iterator.continually 접근법은 마지막 항목을 그리워하기 때문에 잘못되었습니다.여기에 내 테스트는 다음과 같습니다

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를 사용하여이 작업을 수행 할 수 있습니다.

참고 Debilski의 게시물에 직접 언급 할 담당자가 없습니다.

관련 문제