Scala 의 Map ( or Seq[TupleN] ) 을 루프시키는 방법 4종

5425 단어 Scala

소개



Scala 에서는 루프 처리는 많이 사용되지만, Map 의 key 와 value 를 루프 시키기 위해서는 조금 고안이 필요하기 때문에 정리해 둡니다.
또, Scala 의 MapSeq[Tuple2] 와 같이 취급할 수 있으므로, Seq[TupleN] 에도 같은 방법을 사용할 수 있습니다.

하고 싶은 일


val source = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)

이와 같은 Map"a" * 1 ... 를 해 가서 다음과 같은 List
List("a", "bb", "ccc", "dddd")

(좀 더 실용적인 예가 있으면 좋았는데 생각하지 못했기 때문에 용서해 )

case 로 패턴 매치


source.map({case (key, value) => key * value})

잘 보는 것 같아요.

for 에서 패턴 매치


for ((key, value) <- source) yield key * value

모양이 다른 것만으로 case와 거의 같습니다.

Function.Tupled


source.map(Function.tupled((key, value) => key * value))

별로 보지 않지만 개인적으로 가장 좋아합니다.Function.TupledFunctionN[引数1, 引数2, ... 戻り値]Function1[TupleN[引数1, 引数2, ... ], 戻り値] 로 변환하는 함수입니다. (알기 어렵다…)
source.map(Function.tupled(_ * _))

언더스코어 기법도 사용할 수 있는 것이 편리합니다.

보통 map 한다


source.map(tuple => tuple._1 * tuple._2)

제일 솔직? 한 방법입니다.tuple 라는 인수를 정의하지 않으면 안되는 것이 미묘합니다.

결론



어떻습니까?
4종을 들어 보았지만, 어느 것을 사용하는지는 기호라고 생각합니다.


Seq[TupleN] 의 루프는 사용합니까? 라는 의견도 있을 것 같으므로, 자신이 자주 사용하는 관용구를 붙여 둡니다.
길이가 같은 Seq 를 정리해 루프 시키고 싶은 경우입니다.
인덱스를 사용해 루프 시키는 것보다 예쁘게 쓸 수 있습니다.
val valuesA = Seq(1, 2, 3, 4)
val valuesB = Seq(5, 6, 7, 8)
for ((a, b) <- valuesA zip valuesB) someFunction(a, b)

좋은 웹페이지 즐겨찾기