Other - 07 - Lambda学习笔记 - Lambda

Stream

如果说 Lambda 对于 Java 是语法上的一个改进,那么 Stream 就是对于 Java 容器集合的改进。

Stream 流是一个值序列的抽象,它位于 java.util.stream 包下,它代表着一系列的值,它和 Java 集合容器具有一些相同的特性,但是它们有着本质的不同。

集合容器是存储值的,而流是一个值的视图,它不存储值,它是值的一组镜像。

集合是有限的,而流可以是有限的也可以是无限的。

流提供了许多方便的聚集操作,而且有可能是并行的聚集,比集合容器来说一些情况下会具有更高的性能。

可以看到对于一个集合 List 来说,它可以通过调用自己的 stream 方法获得自己的流视图,然后就可以对流视图进行聚集操作了。而且这里我们也可以通过代码看到使用了 Lambda 在组合 Stream 之后对于集合容器的操作在一定程度上是可以更加简洁优雅的,这里用一行代码就打印出了所有大于10的偶数。

对于大部分的 Java 集合框架都提供了获取自己流视图的 stream 方法,而对于数组等在 Arrays 工具类中也提供了获取其流视图的方法。

而一旦拿到了一个流视图就代表着我们可以完全的使用函数式编程的方式来对这个流视图进行操作,而对于流的大部分操作都会返回一个流,而部分操作则是终结操作,它会返回一个最终的结果。

可以看到只要合理的使用流视图和方法引用,我们的代码将会变的更加的简单优雅。

映射操作是 Stream 中比较有意思的一个操作。

map 映射可以对流进行一种一对一的映射,结果也很简单就不多说了。

而对于流来说,其内嵌的方法非常之多,基本上可以满足我们大部分的需要,在配合上 Lambda 表达式更是如虎添翼。而对剩下的 Stream Api 我们这里就不在细细分析了,各位可以自行查看 API 文档。


Collect

前部分我们简单的探讨了如何获取一个流,而我们说过一个流其实是一个值的镜像,而当我们做完过滤排序等操作之后,我们很自然的会需要把这个结果存储起来,那么这里就涉及到了一个收集流的过程。

收集流的过程很简单,流提供了一个终结操作 collect,它会按照其内部的一个 Collector 来收集流,而 Collectors 类提供了很多内嵌的 Collector 实现,我们简单的使用即可。

而 groupingBy / mapping 等都是很有意思的收集器实现,各位可以根据自己的喜好挑选自己喜欢的收集器。


parallelStream

parallelStream 是 stream 的兄弟函数,它返回一个并行的流,与串行流不同的是并行流支持并行操作,但是这需要实现的支持,但是经过测试使用并行流居然比使用串行流更慢,可能是我姿势有误,至于并行流就不再做深入讨论了,它的使用方式和串行流一样。


无限流

大部分时候我们都会使用有限流来完成操作,但是有时候我们又会需要使用到无限流,比如说求从1开始的30个完全数,它完全可以抽象为一个无限流的操作。

而 Stream 本身也有几个方法可以生成流。

本系列到此结束。

来自为知笔记(Wiz)

时间: 2024-10-21 02:25:05

Other - 07 - Lambda学习笔记 - Lambda的相关文章

Other - 06 - Lambda学习笔记 - Lambda

Lambda 通过上篇我们基本可以看出来 Lambda 是一个行为非常类似匿名内部类的一个东西,而实际上它大部分时候都是在取代匿名内部类来实现更加简洁的语法. 可以看到这是一个简单的使用 Lambda 去代替 Comparator 匿名类来进行排序的例子. 首先第一是代码变的更加紧凑了,原先需要使用四行半的代码现在半行就搞定,但这不是最重要的,重要的是这种从四行半缩短到半行可以让我们的代码更加容易的进行链式操作. 可以看到如果仍然使用匿名类,那么这个代码就非常的难看了,但是使用 Lambda 就

c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)

所有c++ coder都应该为这个语法感到高兴,说的直白一点,Lambda 表达式就是函数对象的语法糖. 还是直接看对比栗子吧,抄袭的是msdn的官网 该示例使用 for_each 函数调用中嵌入的 lambda 向控制台打印 vector 对象中的每个元素是偶数还是奇数. 使用lambda #include <algorithm> #include <iostream> #include <vector> using namespace std; int main()

学习笔记——Maven实战(十)Maven 3,是时候升级了

去年10月份Apache Maven发布了3.0正式版,而在上个月的22号,Eclipse基金会宣布了Eclipse 3.7(Indigo)的发布,该版本Eclipse最大的新特性之一就是集成了Maven.下载Eclipse IDE for Java Developers版本的用户会发现,Eclipse已经能够自动识别Maven项目了.Indigo中内置的Maven版本是3.0.2,这在一定程度上说明Maven 3已经非常稳定了.不过我相信一定还有很多Maven 2用户在犹豫是否升级,本文会介绍

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

Python学习笔记010——匿名函数lambda

1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要return来返回值,表达式本身结果就是返回值. lambda 仅简洁了代码,并不会提高程序运行效率 如果可以用 for...in...if 来完成的,最好不使用匿名函数lambda 使用lambda时,函数内不要包含循环.嵌套:如果存在,则最好使用def函数来完成,这样的代码可读性和复用性均较高 l

WPF-MVVM模式学习笔记4——Lambda表达式学习

在学习MVVM的过程中,其中自定义了一个超类NotificationObject,如下 public abstract class NotificationObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyChanged(string propertyName) { PropertyChang

【Python学习笔记之三】lambda表达式用法小结

除了def语句之外,Python还提供了一种生成函数对象的表达式形式.由于它与LISP语言中的一个工具很相似,所以称为lambda.就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名.这也就是lambda有时叫做匿名函数的原因.实际上,他们常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码. lambda表达式 lambda的一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表及其相似)

JAVA8学习——深入浅出Lambda表达式(学习过程)

JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在JavaScript中,函数参数是一个函数,返回值是另一个函数的情况下非常常见的,JavaScript是一门非常典型的函数式编程语言,面向对象的语言 //如,JS中的函数作为参数 a.execute(callback(event){ event... }) Java匿名内部类实例 后面补充一个匿名内

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,