당신이 항상 목록에 정확히 하나 개의 요소가있을 것이라는 점을 확신합니까? 그렇다면 분명히해야하며, 실수로 나쁜 목록 (정확히 하나의 요소가 없음)을 얻으면 오류를 던질 수 있다는 이점이 있습니다.
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 })
세미콜론을 사용하지 마십시오. – dhg