지도 작업에서 튜플 풀기


79

나는 종종 튜플의 Lists, Seqs 및 Iterators로 작업하고 있으며 다음과 같은 작업을하고 싶습니다.

val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }

그러나 컴파일러는이 구문에 동의하지 않는 것 같습니다. 대신 나는 글을 쓰게됩니다.

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}

어리석은 일입니다. 이 문제를 어떻게 해결할 수 있습니까?

답변:


137

해결 방법은 다음을 사용하는 것입니다 case.

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}

37
그리고 튜플 요소를 입력 할 필요조차 없습니다. case (e1, e2) => 충분하면 튜플 요소의 유형이 알려져 있습니다.
Didier Dupont

32

나는 tupled 함수를 좋아한다. 편리하고 중요한 것은 안전한 유형입니다.

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }

18

왜 사용하지 않습니까

arrayOfTuples.map {t => t._1.toString + t._2 }

매개 변수가 여러 번 필요하거나 다른 순서로 필요하거나 중첩 된 구조에서 _가 작동하지 않는 경우

arrayOfTuples map {case (i, s) => i.toString + s} 

짧지 만 읽을 수있는 형식 인 것 같습니다.


1
나는 주된 이유는 대부분의 시간,지도 기능의 처리가 훨씬 더보다 복잡 것을 추측 _.toString + _하고 그보다 더 이해하기 쉬운 이름을 조작하고 싶은 t._1t._2.
Nicolas

글쎄, arrayOfTuples map {case (i, s) => i.toString + s}물론 더 편리합니다. 그러나 필요한 답변을 얻으려면 가지고있는 질문을해야합니다. :)
사용자 알 수없는

글쎄, 그가 "자주"라고 말했듯이 "다른 경우"를 의미하기를 바랍니다 Int + String. 매핑 이 자주 필요한 시나리오는 보이지 않습니다 . ;)
Nicolas

7

또 다른 옵션은

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}

2

참고로 Dotty(재단 Scala 3) 파라미터 untupling가 확장 같은 구문을 허용되었습니다

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")

여기서 각각 _은 연관된 튜플 부분을 참조합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.