Stream 和 List 一样,是一种递归的数据结构
从大学到工作一直是java,c++,c,c#这些都不是函数式的编程语言,并且递归已经被判了死刑(通常因为系统方法调用栈太小,且JVM不会做尾递归优化)。所以,Stream这样递归的数据结构,理解起来不是那么自然。
看个简单例子
lazy val fib: Stream[BigInt] = Stream.cons(1, Stream.cons(1, (fib zip fib.tail).map(p => p._1 + p._2)))
非波那且数列,,,好吧,这个例子一点也不简单,对于我来说。
它定义了一个无限的数列。 这在我以前看来简直是不可能的。
一个无限的数列可以进行 (fib zip fib.tail).map(p => p._1 + p._2) 这种疯狂的操作,这怎么可能呢?居然不会堆栈溢出
cons看起来像函数,其实是一个对象
我将其翻译递归表达式
lazy val fib1: Int => List[Int] = { x =>
x match {
case 1 => 1 :: Nil
case 2 => 1 :: 1 :: Nil
case n if n > 2 => 1 :: 1 :: (fib1(n - 1).tail zip fib1(n - 2)).map(p => p._1 + p._2)
}
}
两者性能,不可同日而语
fib因为是一个lazy的Stream,所以在定义不会进行任何计算。只有在调用fib.take(10)时才会计算。依次构造出(1,(1,(2,(3,(5.......这样的递归的数据结构‘
具体可以看这里 http://stackoverflow.com/questions/7225310/scala-pattern-matching-variable 这个问题的一个答案,我画了插图解释
分享到:
相关推荐
标题“stream-benchmark:Scala Stream 上的简单基准测试”揭示了这是一个关于使用Scala编程语言进行流处理性能评估的项目。Scala Stream是Scala语言中的一个特性,它允许我们处理无限数据序列,同时保持低内存消耗和...
- **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如Lambda表达式和Stream API。 - **互操作性**:Scala可以直接调用Java库,反之亦然,这得益于良好的Java互操作性。 - ...
6. **更好的互操作性**:Scala 2.11加强了与Java代码的互操作,包括对Java 8新特性的支持,如Lambda表达式和Stream API。 7. **模块化**:2.11版本开始将Scala库划分为多个模块,比如编译器、运行时、标准库等,...
Scala 2.12.x版本是针对Java 8及更高版本的,它引入了对Java 8特性的支持,如lambda表达式和Stream API的互操作。版本号中的".7"表示这是一个维护更新,可能修复了一些已知问题,提升了性能,或者增加了新的特性。 ...
Scala 2.12.0是一个重要的版本更新,它提供了对Java 8的更好支持,尤其是对于lambda表达式和Stream API的兼容性。 1. **Scala语言特性**: - **多范式编程**:Scala支持面向对象和函数式编程,使得开发者可以根据...
10. **Scala-2.11.8对Java 8的支持**:此版本增加了对Java 8新特性的支持,如Lambda表达式和Stream API。查看相关源码,可以理解Scala是如何与Java 8无缝集成的。 总的来说,深入学习Scala-2.11.8的源码是一项挑战...
此外,Scala-2.11.8对Java 8的支持意味着你可以利用Lambda表达式、Stream API等新特性,使得与Java代码的互操作变得更加顺畅。 总之,`scala-2.11.8.tgz` 是Scala开发者的重要资源,它包含了所有你需要开始或继续...
2. **Java 8兼容**:Scala 2.12完全支持Java 8的特性,如Lambda表达式和Stream API,使得开发者可以无缝地在两种语言间切换。 3. **Dotty兼容性**:Scala 2.12在向Scala 3(原名Dotty)过渡的过程中,引入了一些新...
2.12.x系列的一个显著特点是它对Java 8的支持,包括对lambda表达式和Stream API的集成。 Scala的安装文件`scala-2.12.8.msi`是一个Windows安装程序,它将帮助用户在他们的系统上设置Scala环境,包括Scala命令行解释...
Scala 2.11.x系列引入了许多改进和新特性,包括更好的类型推断、更高效的编译器以及对Java 8特性的支持,如Lambda表达式和Stream API。这个版本也优化了与Java库的互操作性,使得混合Java和Scala项目更加无缝。 ...
这个版本的Scala兼容Java 8,因此它可以无缝地与Java代码集成,利用Java 8的新特性,如lambda表达式和Stream API。 Scala-2.11.x系列是Scala的一个重要分支,其中的数字11代表的是它兼容的Java虚拟机(JVM)版本。...
这个版本引入了更好的类型推断、性能提升以及对Java 8特性的支持,如Lambda表达式和Stream API。此外,它还增强了对并发编程的支持,提供了更强大的Actor模型和软件事务内存(STM)。 在API方面,Scala的基础库非常...
- **兼容性**:Scala 2.12.4与Java 8兼容,利用了Java 8的新特性,如Lambda表达式和Stream API。这使得Scala开发者能够更好地与Java生态系统集成。 - **编译器优化**:2.12.x版本的编译器进行了大量优化,提高了...
2. **Java 8 兼容**:此版本支持 Java 8 的 Lambda 表达式和 Stream API,使得与 Java 代码的交互更加平滑。 3. **性能提升**:2.12.0 版本通过使用更现代的 JVM 特性(如 invokedynamic)和编译器优化,提升了运行...
通过DStream(Discretized Stream)抽象,开发者可以将实时数据流视为一系列离散的批处理作业,从而利用Spark的并行处理能力。 在机器学习部分,MLlib提供了各种算法,包括分类、回归、聚类、协同过滤等。这些算法...
2.12主要关注的是与Java 8的兼容性,特别是利用了Java 8的Lambda表达式和Stream API,同时保持向后兼容早期的2.x版本。 在压缩包中,有两个文件: 1. `scala-2.12.8.msi`:这是Windows安装程序包,使用Microsoft ...
它包括Actor、Stream、HTTP服务器等功能,广泛应用于构建高可用、高伸缩性的应用。 学习Scala并发编程,除了阅读指定的《Scala编程》或《Scala编程思想》书籍外,还可以参考Akka官方文档,参与开源项目,进行实战...
读者将了解如何设置DStream(Discrete Stream),处理实时数据流,以及如何实现窗口、滑动窗口和状态管理等高级实时计算功能。 通过阅读《大数据书籍-Scala编程》,读者不仅能掌握Scala编程的基础和高级技巧,还能...
Work on a wide array of applications, from simple batch jobs to stream processing and machine learning Explore the most common as well as some complex use-cases to perform large-scale data analysis ...