📜  斯卡拉 | flatMap 方法

📅  最后修改于: 2022-05-13 01:54:59.816000             🧑  作者: Mango

斯卡拉 | flatMap 方法

在 Scala 中, flatMap()方法与map() 方法相同,但唯一的区别是在flatMap中,项目的内部分组被删除并生成了一个序列。它可以定义为map方法和flatten方法的混合。通过运行map方法和flatten方法获得的输出与flatMap()获得的输出相同。所以,我们可以说flatMap先运行map方法,然后运行flatten方法来生成想要的结果。
笔记:

  • 它有一个内置的Option类,因为 Option 可以表示为一个最多有一个元素的序列,即,它要么是空的,要么只有一个元素。
  • flatten() 方法用于分解 Scala 集合的元素,以便构造具有相似类型元素的单个集合。

让我们看一个例子来说明flatMap是如何工作的。

val name = Seq("Nidhi", "Singh")

情况1:
让我们在指定的序列上应用 map() 和 flatten()。

案例二:
让我们直接在给定的序列上应用 flatMap()。

name.flatMap(_.toLowerCase)
 
// Output
List(n, i, d, h, i, s, i, n, g, h)

所以,我们可以在这里看到两种情况下得到的输出是相同的,因此,我们可以说flatMapmapflatten方法的组合。
现在,让我们看一些flatMap方法的例子。

  • 在一系列字符串上使用flatMap
    例子:
    // Scala program of flatMap
      
    // Creating object
    object GfG
    { 
      
        // Main method
        def main(args:Array[String])
        {
      
            // Creating a sequence of strings
            val portal = Seq("Geeks", "for", "Geeks")
      
            // Applying flatMap
            val result = portal.flatMap(_.toUpperCase)
      
            // Displays output
            println(result)
      
        }
    }
    
    输出:
    List(G, E, E, K, S, F, O, R, G, E, E, K, S)
    

    在这里,将flatMap应用于所述序列,因此生成了字符序列列表。

  • flatMap与其他功能一起应用。
    例子 :
    // Scala program of flatMap
      
    // Creating object
    object GfG
    { 
      
        // Main method
        def main(args:Array[String])
        {
      
            // Creating a list of numbers
            val list = List(2, 3, 4)
      
            // Defining a function
            def f(x:Int) = List(x-1, x, x+1)
      
            // Applying flatMap
            val result = list.flatMap(y => f(y))
      
            // Displays output
            println(result)
      
        }
    }
    
    输出:
    List(1, 2, 3, 2, 3, 4, 3, 4, 5)
    

    在这里, flatMap应用于程序中定义的另一个函数,因此生成了一个数字序列列表。让我们看看如何计算输出。

    List(List(2-1, 2, 2+1), List(3-1, 3, 3+1), List(4-1, 4, 4+1))
    
    // After evaluation we get,
    List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5))
    

    所以,第一步就像在另一个函数上应用map方法一样。

    List(1, 2, 3, 2, 3, 4, 3, 4, 5)
    

    第二步的工作方式类似于将flatten应用于第一步通过 map 方法获得的输出。
    例子 :

    // Scala program of flatMap
      
    // Creating object
    object GfG
    { 
      
        // Main method
        def main(args:Array[String])
        {
      
            // Creating a sequence of numbers
            val seq = Seq(4, 5, 6, 7)
      
            // Applying flatMap on another
            // function
            val result = seq flatMap { s =>
                            Seq(s, s-1)
            }
      
            // Displays output
            println(result)
      
        }
    }
    
    输出:
    List(4, 3, 5, 4, 6, 5, 7, 6)
    

    在这里,也获得了输出,就像flatMap的第一个示例一样,具有其他功能。

  • 在 if-else 语句中使用flatMap
    例子 :
    // Scala program of flatMap
      
    // Creating object
    object GfG
    { 
      
        // Main method
        def main(args:Array[String])
        {
      
            // Creating a sequence of numbers
            val seq = Seq(8, 15, 22, 23, 24)
      
            // Applying flatMap on if-else
            // statement
            val result = seq flatMap { s =>
                    if (s % 3 == 0) Seq(s)
                    else Seq(-s)
            }
      
            // Displays output
            println(result)
        }
    }
    
    输出:
    List(-8, 15, -22, -23, 24)
    

    在这里,如果给定序列的元素满足所述条件,则返回该元素,否则获得该元素的负数。