복붙노트

[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. ==============================

    1.이 문제에 대한 이유는 그 순서대로 문자 시퀀스 (IndexedSeq [문자열]) 등의 문자열 스칼라 취급에 문자열 "맵"을 적용한다. 이것은 당신이 말한 시퀀스의 각 요소에 대해, 조작이 적용되는지도 호출의 결과로 무엇을 얻을 수 있습니다. 스칼라지도를 적용하는 순서로 문자열을 처리하기 때문에, 그 mapreturns 것입니다.

    이 문제에 대한 이유는 그 순서대로 문자 시퀀스 (IndexedSeq [문자열]) 등의 문자열 스칼라 취급에 문자열 "맵"을 적용한다. 이것은 당신이 말한 시퀀스의 각 요소에 대해, 조작이 적용되는지도 호출의 결과로 무엇을 얻을 수 있습니다. 스칼라지도를 적용하는 순서로 문자열을 처리하기 때문에, 그 mapreturns 것입니다.

    단순히 그것이 문자열을 다시 한 다음 "변환", 나중에 그 순서에 평평하게 호출합니다 flatMap

  2. ==============================

    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. ==============================

    3.지도 기능 C => ( "."+ c)는 문자 반환 문자열을 사용합니다. 그것은 목록을 복용하고 목록의 목록을 반환하는 것과 같습니다. flatMap은 다시 평평.

    지도 기능 C => ( "."+ c)는 문자 반환 문자열을 사용합니다. 그것은 목록을 복용하고 목록의 목록을 반환하는 것과 같습니다. flatMap은 다시 평평.

    당신이 문자열 대신 문자를 반환하는 경우는, 예를 들어, 결과는 평평 필요가 없을 것입니다 "ABC".MAP (c => (c + 1) .toChar) 복귀 "BCD".

  4. ==============================

    4.지도를 사용하면 문자의 목록을 복용하고 문자열 목록으로 돌려. 즉 당신이 볼 수있는 결과이다. 지도는 목록의 길이를 절대 변경 - 원래 문자열과 같은 많은 요소가 문자가 같은 문자열 목록이 있습니다.

    지도를 사용하면 문자의 목록을 복용하고 문자열 목록으로 돌려. 즉 당신이 볼 수있는 결과이다. 지도는 목록의 길이를 절대 변경 - 원래 문자열과 같은 많은 요소가 문자가 같은 문자열 목록이 있습니다.

    flatMap하면 문자의 목록을 복용하고 문자열 목록으로 선회하고 다시 하나의 문자열로 함께 그 문자열을 박쥐 우산. 당신이 목록의 목록을 생성하지 않고, 여러 요소에 목록에서 하나 개의 요소를 설정하고자 할 때 flatMap 유용합니다. (이것은 물론 또한 결과 목록이 0을 포함하여, 임의의 길이를 가질 수 있음을 의미합니다 -. 당신이 빈 목록으로 시작하지 않는 한이지도 할 수 없습니다)

  5. ==============================

    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
    
  6. from https://stackoverflow.com/questions/19209519/map-versus-flatmap-on-string by cc-by-sa and MIT license