【 Effective java】第7章 读书笔记

第7章 Lambda 和 Stream

42,Lambda 优先于匿名类

函数类型:

函数对象:

匿名类:

函数接口:

可以删除所有 Lambda 参数类型(编译器会根据上下文推断),除非它们会使程序变得更加清晰。

Lambda 没有名称和文档,如果一个计算本身不是自描述的,或者超出了几行,那就不要把它放在一个 Lambda 中。

Lambda 与匿名类共享你无法可靠的通过实现来序列化和反序列化的属性,因此,尽可能不要去序列化一个Lambda(或者匿名类实例)。

千万你要给函数对象使用匿名类,除非创建非函数接口的类型的实例。

43,方法引用优先于 Lambda

方法引用:很好的既解析:https://www.jianshu.com/p/62465b26818f

只要方法引用能做的,Lambda 都可以做,但是方法引用更加简洁,但是理解难度更大,没必要刻意去使用方法引用。

在同一个类中,Lamda 比方法引用更简洁。

44,坚持使用标准的函数接口

只要标准的函数接口能够满足需求,通常应该优先考虑,而不是专门的再构建一个新的函数接口。

java.util.Function 有43个接口。

其中6个基本的函数接口:

Unary < T >:

Binary < T >:

Predicate < T >:

Function < T >:

Supplier < T >:

Consumer < T >:

它们各自还有三个变体(int,long,double),例如带有 int 的 predicate:IntPredicate。

现在大多数标准函数式接口都只支持基本类型,千万不要用带有包装类的基础函数接口来代替基本函数接口。

@FunctionalInterface:标注函数使接口,与@Override类似。必须对自己编写的函数式接口始终标注。

作用:

  1. 告诉这个类及其文档的读者,这个接口时针对Lambda 设计的。
  2. 这个接口不会被编译,除非它只有一个抽象方法。
  3. 避免后续维护人员不小心给该接口添加抽象方法。

函数式接口再API中的使用:

不要在相同的位参数位置,提供不同的函数接口来进行重载,否则可能在客户端产生歧义。

45,谨慎使用 Stream

Stream:代表数据元素有限或无限的顺序。

Stream pipeline(管道流):这些元素一个多级计算。包含一个 Stream 接着是0个或多个中间操作和一个终止操作

Stream pipeline 通常是 lazy 的,直到调用终止操作才会开始计算,对于终止操作不需要的数据元素,永远不会进行计算。正式这种 lazy 计算,使 Stream 无限计算才有了可能。

Stream API 是流式的。所有包含pipeline的调用可以连接成一个表达式。

事实上,多个 pipeline 也可以连接在一起成为一个表达式。

默认情况下,Stream pipeline 是顺序执行的,要使 Stream pipeline并发执行,只需要在 pipeline 的任何 Stream 调用 parallel 方法即可,但是通常不建议这么做,

Stream 足以进行任何计算,但是”可以“并不意味着”应该“。

滥用 Stream 会使程序难以阅读和维护。

在没有显式类型的情况下,仔细命名 Lambda 参数这对可读性至关重要。

最好避免 Stream 来处理 char 值。

最好结合 Stream 与迭代一起用来完成任务,重构现有代码来使用 Stream,并且只有在必要时才在新代码中使用。

46,优先选择 Stream 中无副作用的函数

纯函数:其结构只取决于输入的函数:它不依赖任何可变的状态,也不更新任何状态。

Stream 操作的任何函数对象,无论中间操作还是终止操作,应该是无副作用的。

forEach 操作应该只用于报告 Stream 计算的结果,而不是执行计算。

47,Stream 要优先用Collection 作为返回类型

对于公共的,返回序列的方法,Collection 或者适当的子类型通常是最佳的返回类型。

千万别再内存中保存巨大的序列,将它当作集合即可。

在编写返回一系列的方法时,要记住有些用户可能相当做Stream处理,可其他用户可能想要迭代,要尽量两边兼顾。

48,谨慎使用 Stream 并行

parallel开启并行。

如果源头来自 Stream.iterate,或者使用了中间操作 linit,那么并行 pipeline 也不可能提升性能。

千万不要任意并行Stream pipeline,它造成的性能后果肯时灾难性的。

在 Stream 上通过并行获取性能,最好时通过 ArrayList,HashMap,HashSet,ConcurrentHashMap实例,数组,int 范围和 long 范围。这些数据结构的共性是:都可以被精确地,轻松地分成任意大小的子范围。

在适当条件下,给Stream pipeline 添加 parallel 调用,确实可以在多核处理器地情况下提供近乎线性地倍增,某些域如机器学习和数据处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值