[SCALA] 문자열에 FlatMap 대지도
SCALA문자열에 FlatMap 대지도
스칼라 함수 프로그래밍의 원칙에서 컬렉션 강의를 듣고, 나는이 예제를 보았다 :
scala> val s = "Hello World"
scala> s.flatMap(c => ("." + c)) // prepend each element with a period
res5: String = .H.e.l.l.o. .W.o.r.l.d
씨 Odersky 여기에지도를 사용하지 않은 이유는 다음, 나는 궁금했다. 내가지도를 시도하지만, 나는 내가 기대했던 것보다 다른 결과를 얻었다.
scala> s.map(c => ("." + c))
res8: scala.collection.immutable.IndexedSeq[String] = Vector(.H, .e, .l, .l, .o,
". ", .W, .o, .r, .l,
나는 "순서"나는 각 항목에 함수를 적용지도-ING, 즉 해요 이후, 문자열을 반환하는 위의 호출을 예상 한 다음 새 반환 "순서를."
그러나, 나는 오히려 목록 [문자열]에 대한 flatmap보다지도를 수행 할 수 있습니다 :
scala> val sList = s.toList
sList: List[Char] = List(H, e, l, l, o, , W, o, r, l, d)
scala> sList.map(c => "." + c)
res9: List[String] = List(.H, .e, .l, .l, .o, ". ", .W, .o, .r, .l, .d)
왜 문자열에지도를 호출하는 IndexedSeq [문자열] 반환 형식이었다?
해결법
-
==============================
1.이 문제에 대한 이유는 그 순서대로 문자 시퀀스 (IndexedSeq [문자열]) 등의 문자열 스칼라 취급에 문자열 "맵"을 적용한다. 이것은 당신이 말한 시퀀스의 각 요소에 대해, 조작이 적용되는지도 호출의 결과로 무엇을 얻을 수 있습니다. 스칼라지도를 적용하는 순서로 문자열을 처리하기 때문에, 그 mapreturns 것입니다.
이 문제에 대한 이유는 그 순서대로 문자 시퀀스 (IndexedSeq [문자열]) 등의 문자열 스칼라 취급에 문자열 "맵"을 적용한다. 이것은 당신이 말한 시퀀스의 각 요소에 대해, 조작이 적용되는지도 호출의 결과로 무엇을 얻을 수 있습니다. 스칼라지도를 적용하는 순서로 문자열을 처리하기 때문에, 그 mapreturns 것입니다.
단순히 그것이 문자열을 다시 한 다음 "변환", 나중에 그 순서에 평평하게 호출합니다 flatMap
-
==============================
2.또한 flatMap와지도 사이의 차이를 보여 처음있는 흥미로운 "스칼라 flatMap 사례의 수집"을 가지고 :
또한 flatMap와지도 사이의 차이를 보여 처음있는 흥미로운 "스칼라 flatMap 사례의 수집"을 가지고 :
scala> val fruits = Seq("apple", "banana", "orange") fruits: Seq[java.lang.String] = List(apple, banana, orange) scala> fruits.map(_.toUpperCase) res0: Seq[java.lang.String] = List(APPLE, BANANA, ORANGE) scala> fruits.flatMap(_.toUpperCase) res1: Seq[Char] = List(A, P, P, L, E, B, A, N, A, N, A, O, R, A, N, G, E)
scala> val mapResult = fruits.map(_.toUpperCase) mapResult: Seq[String] = List(APPLE, BANANA, ORANGE) scala> val flattenResult = mapResult.flatten flattenResult: Seq[Char] = List(A, P, P, L, E, B, A, N, A, N, A, O, R, A, N, G, E)
-
==============================
3.지도 기능 C => ( "."+ c)는 문자 반환 문자열을 사용합니다. 그것은 목록을 복용하고 목록의 목록을 반환하는 것과 같습니다. flatMap은 다시 평평.
지도 기능 C => ( "."+ c)는 문자 반환 문자열을 사용합니다. 그것은 목록을 복용하고 목록의 목록을 반환하는 것과 같습니다. flatMap은 다시 평평.
당신이 문자열 대신 문자를 반환하는 경우는, 예를 들어, 결과는 평평 필요가 없을 것입니다 "ABC".MAP (c => (c + 1) .toChar) 복귀 "BCD".
-
==============================
4.지도를 사용하면 문자의 목록을 복용하고 문자열 목록으로 돌려. 즉 당신이 볼 수있는 결과이다. 지도는 목록의 길이를 절대 변경 - 원래 문자열과 같은 많은 요소가 문자가 같은 문자열 목록이 있습니다.
지도를 사용하면 문자의 목록을 복용하고 문자열 목록으로 돌려. 즉 당신이 볼 수있는 결과이다. 지도는 목록의 길이를 절대 변경 - 원래 문자열과 같은 많은 요소가 문자가 같은 문자열 목록이 있습니다.
flatMap하면 문자의 목록을 복용하고 문자열 목록으로 선회하고 다시 하나의 문자열로 함께 그 문자열을 박쥐 우산. 당신이 목록의 목록을 생성하지 않고, 여러 요소에 목록에서 하나 개의 요소를 설정하고자 할 때 flatMap 유용합니다. (이것은 물론 또한 결과 목록이 0을 포함하여, 임의의 길이를 가질 수 있음을 의미합니다 -. 당신이 빈 목록으로 시작하지 않는 한이지도 할 수 없습니다)
-
==============================
5.당신이지도를 실행하는 상황에서 사용 flatMap은 flattern 하였다. 특정 상황이 있습니다 :
당신이지도를 실행하는 상황에서 사용 flatMap은 flattern 하였다. 특정 상황이 있습니다 :
• 기존 모음에서 새 컬렉션을 만들지도 (또는에 대한 / 수율 표현)를 사용하고 있습니다.
• 결과 컬렉션 목록의 목록입니다.
• 당신은지도 직후 평평 (또는에 대한 / 수율 표현)를 호출합니다.
이 상황에있을 때, 당신은 대신 flatMap를 사용할 수 있습니다.
예 : 가방의 모든 정수를 추가
val bag = List("1", "2", "three", "4", "one hundred seventy five") def toInt(in: String): Option[Int] = { try { Some(Integer.parseInt(in.trim)) } catch { case e: Exception => None } }
flatMap 방법을 사용하여
> bag.flatMap(toInt).sum
지도의 방법을 사용하여 (3 단계가 필요)
bag.map(toInt) // List[Option[Int]] = List(Some(1), Some(2), None, Some(4), None) bag.map(toInt).flatten //List[Int] = List(1, 2, 4) bag.map(toInt).flatten.sum //Int = 7
from https://stackoverflow.com/questions/19209519/map-versus-flatmap-on-string by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 분리 대 검증 (0) | 2019.11.15 |
---|---|
[SCALA] 하지가 슬릭 3.0.0에있는 경우 삽입 (0) | 2019.11.15 |
[SCALA] 스칼라 2.10 반사, 나는 경우 클래스의 경우 클래스, 즉 필드 목록에서 필드 값을 추출 어떻게 (0) | 2019.11.15 |
[SCALA] 스칼라의 형식 매개 변수로 표현 형식의 인스턴스를 인스턴스화하는 방법 (0) | 2019.11.15 |
[SCALA] 때 @uncheckedVariance 스칼라에 필요하고, 왜 GenericTraversableTemplate에 사용됩니까? (0) | 2019.11.15 |