2013-12-12 3 views
0

Map에서 List [T] 타입의 값을 T에서 추출하려고한다. 예를 들어 그래서 :스칼라가 맵을 반복하고 싱글 톤리스트를 싱글 톤으로 바꾼다

val Some(values) = request.body.asFormUrlEncoded.foreach { 
    case (key,value) => 
    Map(key->value.head); 
}; 

여기에 내가 수신하고있는 오류입니다 :

val c = Map(1->List(1), 2-> List(2), 3->List(3)); 

여기

Map(1->1,2->2,3->3); 

로 변신 것 내가 지금까지 쓴 것입니다

constructor cannot be instantiated to expected type; found : (T1, T2) required: scala.collection.immutable.Map[String,Seq[String]] 

편집 : This is ocurring wrt 이 라인 :

case (key,value) => 

EDIT2 : request.body.asFormUrlEncoded 예를 출력

Some(Map(test -> List(324))) 
Some(Map(SpO2 -> List(456), ETCO2 -> List(123))) 
+1

세미콜론을 사용하지 마십시오. – dhg

답변

4

당신이 항상 목록에 정확히 하나 개의 요소가있을 것이라는 점을 확신합니까? 그렇다면 분명히해야하며, 실수로 나쁜 목록 (정확히 하나의 요소가 없음)을 얻으면 오류를 던질 수 있다는 이점이 있습니다.

c.map { case (k, List(v)) => k -> v } 
// Map(1 -> 1, 2 -> 2, 3 -> 3) 

첫 번째 사용자의 목록이 하나 개 이상의 요소를 가질 수 있습니다, 당신은 단지 싶은 경우에, 당신은 (빈리스트에 오류 것이다)이 작업을 수행 할 수 있습니다

val d = Map(1 -> List(1), 2 -> List(2,4,6), 3 -> List(3)) 
d.map { case (k, List(v, _*)) => k -> v } 
// Map(1 -> 1, 2 -> 2, 3 -> 3) 

당신의 목록이 없을 수 있습니다 경우

val e = Map(1 -> List(1), 2 -> List(2,4,6), 3 -> List(3), 4 -> List()) 
e.collect { case (k, List(v)) => k -> v } 
// Map(1 -> 1, 3 -> 3) 

: 정확히 하나 개의 요소는, 당신은, 던지는 오류 대신이 아닌 싱글 목록을 무시 map 대신 collect를 사용하려면 당신의 코드명

으로는 :

val Some(values) = request.body.asFormUrlEncoded.foreach { 
    case (key,value) => 
    Map(key->value.head); 
}; 

이 정말 이해가되지 않습니다.

먼저 off, foreach은 아무 것도 반환하지 않으므로 그 결과를 변수에 할당하면 작동하지 않습니다. 대신이 컬렉션을 map으로 지정하여 컬렉션을 반환 할 수 있습니다.

둘째, Some을 사용하면 Option을 이해하지 못하는 것처럼 보일 수 있으므로이를 읽으십시오.

셋째, 결과가 Map (쌍 모음)이되게하려면지도가 아닌 key->value.head 인 쌍만 반환하면됩니다.

넷째, case (key,value)에서 일치하는 오류가 발생하는 경우 asFormUrlEncoded은 실제로 쌍 모음을 반환하지 않습니다. 그 유형이 실제로 무엇인지보아야합니다.

마지막으로 세미콜론은 필요하지 않습니다. 그들을 제거해야합니다.귀하의 의견에 따라


편집 : 사실 Some(Map("test" -> List(324))) 같은 것들을 반환

request.body.asFormUrlEncoded 때문에, 여기에 코드가 보일 것입니다 방법이다.

asFormUrlEncoded 경우가 None를 반환 할 수 있습니다, 당신은 것을 처리하는 어떤 방법이 없어, 당신은 그것을 방지해야한다 : 당신이 asFormUrlEncoded 이미 Some를 반환해야 경우

val a = Some(Map("test" -> List(324))) 
val value = a match { 
    case Some(m) => m.collect { case (k, List(v)) => k -> v } 
    case None => sys.error("expected something, got nothing") 
} 

, 당신은 그냥 이렇게 할 수 있습니다 :

val a = Some(Map("test" -> List(324))) 
val Some(value) = a.map(_.collect { case (k, List(v)) => k -> v }) 
+0

나는이 세 가지를 모두 시험해 보았고, 나는 여전히 내가 OP에서 만든 오류를 얻는다. –

+0

@ Lilluda5,'c' 등으로 해봤습니까? – dhg

+0

나는 작전에서 가진 것과 함께 시험해 보았다. case 문을 변경하고 .map에서 .collect로 변경했습니다. –

관련 문제