📜  Scala 中的递归流和集合

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

Scala 中的递归流和集合

递归形式有它们自己的定义,就像我们在文件夹中有子文件夹一样,文件夹中还可以有子文件夹。调用自身的递归方法也是一种递归形式。类似的形式可用于创建递归流。

示例 1:创建惰性列表

// Scala program for resursive stream
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // second con can be recursive
        lazy val geek = Stream.cons(1, Stream.cons(5, Stream.empty))
          
        println (geek)
          
        (geek take 4) foreach {
            x => println(x)
          
        } 
    } 
} 

输出 :

Stream(1, ?)
1
5

在上面的代码中,第二个 con 可以是递归的。

示例 2:通过对方法进行递归调用来创建惰性列表

// Scala program for resursive stream
  
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // con can be recursive
        def geek(n: Int): Stream[Int] = Stream.cons(n, geek(n+1))
          
        // Creating lazy val
        lazy val q = geek(5)
          
        println(q) 
    } 
} 

输出 :

Stream(5, ?)

示例 3:通过以简洁明了的方式对方法进行递归调用来创建惰性列表

// Scala program for resursive stream
  
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // recursive stream
        def geek(n: Int):Stream[Int] = n #:: geek(n+1)
          
        // Lazy value
        lazy val q = geek(5)
          
        println(q)
  
    } 
} 

输出 :

Stream(5, ?)

流集合

scala 中的流集合非常重要,因为它不需要显式覆盖。声明式的事情可以使用诸如 map、filter 和 flatMap 之类的功能组合器来执行。流是惰性丢失的集合。

示例 4:

// Scala program for stream collection
  
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // creating Stream
        def geek(n: Int):Stream[Int] = n #:: geek(n+1)
          
        lazy val g = geek(0)
          
        println (g)
        println (g.take(10).mkString(" ; "))
    } 
} 

输出 :

Stream(0, ?)
0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9)

示例 5:使用过滤器

// Scala program for filter list
  
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // Creating list
        val geek = List(1, 2, 3, 4)
          
        // Using filter
        val abc = geek filter { x => x > 2 }
        println(abc)
    } 
} 

输出 :

List(3, 4)

filter 在列表 geek 上调用。它将函数作为参数并返回一个布尔值,它是一个函数谓词。每个元素都通过函数运行,并且在函数返回 false 的地方过滤掉元素。它会产生一个新列表,并且原始的“极客”列表保持不变。

示例 6:以非常简洁的方式使用过滤器

// Scala program for collection
  
// creating object 
object Geeks 
{ 
  
    // Main method 
    def main(args: Array[String]) 
    { 
        // Creating list
        val geek = List(1, 2, 3, 4)
          
        // Filter list
        val abc = geek filter { _ > 2 }
        println(abc)
  
    } 
} 

输出 :

List(3, 4)

在上面的代码中,不需要命名元素。该元素通过 a_ 以较短的形式引用。也不需要限定方法调用。