Java8实战读书笔记
Java8实战读书笔记
曲大人的猫
常常因为不够抽象导致不能写出更好的代码而自卑。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
13.2 什么是函数式编程
什么是函数式编程?它是一种使用函数进行编程的方式。一个函数对应于一个数学上的函数 : 它接受零个或多个参数,生成一个或多个结果,并且不会有任何副作用。原创 2024-12-31 10:33:10 · 404 阅读 · 0 评论 -
13.1 实现和维护系统
耦合性 : 软件系统各结构之间是否相互独立。内聚性 : 系统的各相关部分之间如何协作。原创 2024-12-31 10:32:24 · 168 阅读 · 0 评论 -
10.5 小结
【代码】10.5 小结。原创 2024-12-30 14:21:20 · 257 阅读 · 0 评论 -
10.4 使用Optional的实战实例
有效地使用Optional类意味着你需要对如何处理潜在缺失值进行全面反思。原创 2024-12-29 17:38:01 · 228 阅读 · 0 评论 -
10.2 Optional类入门
【代码】10.2 Optional类入门。原创 2024-12-26 12:45:13 · 264 阅读 · 0 评论 -
10.3 应用Optional的几种模式
可以在获取Optional值时使用orElse方法,当Optional里的值为null时,会返回orElse中的值。看作最多包含一个对象的。原创 2024-12-26 12:44:36 · 367 阅读 · 0 评论 -
9.4 解决冲突的规则
下面程序的输出是。原创 2024-12-25 19:50:53 · 343 阅读 · 0 评论 -
10.1 如何为缺失的值建模
默认方法的两种用例 : 可选方法和行为的多继承。原创 2024-12-25 19:50:06 · 234 阅读 · 0 评论 -
9.3 默认方法的使用模式
默认方法的两种用例 : 可选方法和行为的多继承。原创 2024-12-24 11:05:55 · 361 阅读 · 0 评论 -
9.1 不断演进的API
Java8允许在接口声明静态方法,Java8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。原创 2024-12-24 11:04:58 · 427 阅读 · 0 评论 -
8.3 测试Lambda表达式
接受函数作为参数或者返回一个函数的函数称为。可以通过该字段来比较两个。使用Test2来测试程序。下面是程序的完整代码。原创 2024-12-23 11:43:31 · 664 阅读 · 0 评论 -
8.2 使用Lambda重构面向对象的设计模式
一个处理对象可能需要在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作,再转交给下一个处理对象,以此类推。如果你需要采用某个算法的框架,同时又希望有一定的灵活度,能对它的某些部分进行改进,那么采用模板方法设计模式是比较通用的方案。银行的数据库中得到用户的详细信息,最终完成一些让用户满意的操作。策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案。使用工厂模式,你无需向客户暴露实例化的逻辑就能完成对象的创建。首先需要一个观察者接口,它将不同的观察者聚合在一起。原创 2024-12-23 11:43:00 · 1705 阅读 · 0 评论 -
9.1 不断演进的API
Java8允许在接口声明静态方法,Java8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。原创 2024-12-22 09:43:30 · 133 阅读 · 0 评论 -
8.4 调试
程序的每次方法调用都会产生相应的调用信息,包括程序中方法调用的位置、该方法调用使用的参数、被调用方法的本地变量。这些信息被保存在栈帧上。程序失败时,你会得到它的栈跟踪,通过一个又一个栈帧,你可以了解程序失败时的概略信息。原创 2024-12-22 09:42:39 · 259 阅读 · 0 评论 -
8.5 小结
Lambda表达式能提升代码的可读性和灵活性。如果你的代码中使用了匿名类,尽量用Lambda表达式替换它们,但是要注意二者间语义的微妙差别,比如关键字this,以及变量隐藏。跟Lambda表达式比起来,方法引用的可读性更好 。尽量使用Stream API替换迭代式的集合处理。Lambda表达式有助于避免使用面向对象设计模式时容易出现的僵化的模板代码,典型的比如策略模式、模板方法、观察者模式、责任链模式,以及工厂模式。即使采用了Lambda表达式,也同样可以进行单元测试,但是通常你应该关注使用了原创 2024-12-21 21:15:55 · 161 阅读 · 0 评论 -
8.1 为改善可读性和灵活性重构代码
请将所有使用迭代器这种数据处理模式处理集合的代码都转换成Stream API的方式。这样的话,只有在flag为true时才会执行,这便是有条件的延迟执行。这个表达式都会执行(举个例子罢了,没有实际意义),但其实应该只有在。将实现单一抽象方法的匿名类转换成Lambda表达式。使用lambda表达式可以避免这一现象。为true时才执行这个表达式的。在这个调用方法中,无论。原创 2024-12-21 21:15:18 · 582 阅读 · 0 评论 -
7.4 小结
内部迭代让你可以并行处理一个流,而无需在代码中显式使用和协调不同的线程。虽然并行处理一个流很容易,却不能保证程序在所有情况下都运行得更快。并行软件的行为和性能有时是违反直觉的,因此一定要测量,确保你并没有把程序拖得更慢。像并行流那样对一个数据集并行执行操作可以提升性能,特别是要处理的元素数量庞大,或处理单个元素特别耗时的时候。从性能角度来看,使用正确的数据结构,如尽可能利用原始流而不是一般化的流,几乎总是比尝试并行化某些操作更为重要。分支/合并框架让你得以用递归方式将可以并行的任务拆分成更小的任原创 2024-12-20 12:28:30 · 129 阅读 · 0 评论 -
7.3 Spliterator
是java8中加入的另一个新接口。java8中集合框架的所有集合都实现了接口。T是遍历的元素的类型。tryAdvance方法的行为类似于普通的Iterator,因为它会按顺序一个一个使用中的元素,并且如果还有其他元素要遍历就返回true。但trySplit是专为接口设计的,因为它可以把一些元素划出去分给第二个(由该方法返回),让它们两个并行处理。还可通过方法估计还剩下多少元素要遍历,因为即使不那么确切,能快速算出来是一个值也有助于让拆分均匀一点。原创 2024-12-20 12:27:30 · 509 阅读 · 0 评论 -
7.2 分支 合并框架
分支/合并框架的目的是以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。它是接口的一个实现,它把子任务分配给线程池(称为)中的工作线程。原创 2024-12-19 11:42:52 · 719 阅读 · 0 评论 -
7.1 并行流
Stream接口可以让你非常方便地处理它的元素:可以通过对收集源调用方法来把集合转换为并行流。并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。求和其实可以将要求和的数据分块,一个处理器处理一块,用并行流来做的话会好很多。原创 2024-12-19 11:41:16 · 1125 阅读 · 0 评论 -
6.7 小结
【代码】6.7 小结。原创 2024-12-18 11:16:45 · 318 阅读 · 0 评论 -
6.6 开发你自己的收集器以获得更好的性能
优化节的程序。原创 2024-12-18 11:16:13 · 816 阅读 · 0 评论 -
6.5 收集器接口
Collector接口包含了一系列方法,为实现具体的归约操作(即收集器)提供了范本。Collector接口。原创 2024-12-17 12:29:50 · 1048 阅读 · 0 评论 -
6.4 分区
分区是分组的一种特殊情况:有一个作为分类函数,将谓词称为分区函数。我是一名坚定的素食主义者,但我同时患有严重的异食癖,所以我既能吃素食也能吃肉食。但有些外国朋友只吃素食,因此下面的程序会将菜分为素食和肉食。原创 2024-12-17 12:28:35 · 622 阅读 · 0 评论 -
6.3 分组
这里给方法传递了一个,它提取了流中每一道Dish的Dish.Type。这个Function叫作分类函数,它用来把流中的元素分成不同的组。分组操作的结果是一个Map,把分组函数返回的值作为映射的键,把流中所有具有这个分类值的项目的列表作为对应的映射值。按热量为菜分组。原创 2024-12-16 18:32:56 · 876 阅读 · 0 评论 -
6.2 归约和汇总
打印menu中菜的数量。原创 2024-12-14 11:47:12 · 444 阅读 · 0 评论 -
6.1 收集器简介
将元素归约和汇总为一个值元素分组元素分区。原创 2024-12-14 11:46:17 · 288 阅读 · 0 评论 -
5.8 小结
Streams API可以表达复杂的数据处理查询。你可以使用filter、distinct、skip和limit对流做筛选和切片。你可以使用map和flatMap提取或转换流中的元素。你可以使用findFirst和findAny方法查找流中的元素。你可以用allMatch、noneMatch和anyMatch方法让流匹配给定的谓词。这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。你可以利用reduce方法将流中所有的元素迭代合并成一个结果。filter和map等操作是无状态原创 2024-12-13 11:05:52 · 118 阅读 · 0 评论 -
5.7 构建流
这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。产生的流会用给定的函数按需创建值,因此可以无穷无尽的计算下去。统计一个文件中有多少个不同的字符。,通过显式值创建一个流。创建一个斐波那契数列流。生成5个0-1的随机数。生成一个斐波那契数列。原创 2024-12-12 13:34:35 · 349 阅读 · 0 评论 -
5.6 数值流
这一段太抽象了,一会特化流,一会数值流,一会对象流,一会一般流,就名字就换了好几个。要我说,这些流的差别就在于,一类是原始类型,另一类是引用。的主要区别在于一个不包含右边界,另一个包含。如果你想生成1-100的所有数字可以使用。Java8引入了三个原始类型特化流接口。,从而避免了暗含的装箱成本。,分别将流中的元素特化为。原创 2024-12-12 13:34:04 · 214 阅读 · 0 评论 -
5.5 付诸实践
下面有一些题目 (这本书这点还是做得很好的,有很多题目和图片)(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)(2) 交易员都在哪些不同的城市工作过?(3) 查找所有来自于剑桥的交易员,并按姓名排序。(4) 返回所有交易员的姓名字符串,按字母顺序排序。(5) 有没有交易员是在米兰工作的?(6) 打印生活在剑桥的交易员的所有交易额。(7) 所有交易中,最高的交易额是多少?(8) 找到交易额最小的交易。这些题目中没有太难的题目,可以好好做做。原创 2024-12-11 12:16:02 · 744 阅读 · 0 评论 -
5.4 归约
将流归约成一个值的操作称为。原创 2024-12-11 12:15:14 · 700 阅读 · 0 评论 -
5.3 查找和匹配
另一个常见的数据处理套路是看看数据集中的某些元素是否匹配一个给定的属性。原创 2024-12-10 15:03:27 · 450 阅读 · 0 评论 -
5.2 映射
如果你想把几个字符串转换为一个列表,并且每一个元素都是一个字符串,字符串中只有一个字符且去重。方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。方法让你把流中的每一个值都换成另一个流,然后把所有的流连接起来称为另一个流。方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。将菜名列表转为菜名长度列表。将菜列表转换为菜名列表。原创 2024-12-09 14:03:25 · 651 阅读 · 0 评论 -
5.1 筛选和切片
有一个Dish类。原创 2024-12-09 14:02:26 · 900 阅读 · 0 评论 -
4.5 小结
流是“从支持数据处理操作的源生成的一系列元素”。流利用内部迭代。流有两种操作 :中间操作和终端操作。filter和map等中间操作会返回一个流,并可以链接在一起。forEach和count等终端操作会返回一个非流的值,并处理流水线以返回结果。流中的元素是按需计算的。原创 2024-12-08 14:19:27 · 114 阅读 · 0 评论 -
4.4 流操作
中的Stream接口定义了许多操作。它们可以分为中间操作和终端操作。On java中将其称为惰性求值和及早求值。原创 2024-12-08 14:18:57 · 224 阅读 · 0 评论 -
4.3 流与集合
流和集合的第一个差异在于什么时候计算。原创 2024-12-08 14:18:20 · 266 阅读 · 0 评论 -
4.2 流简介
最后,collect操作开始处理流水线,并返回结果(它和别的操作不一样,因为它返回的不是流,在这里是一个List)。在调用collect之前,没有任何结果产生,实际上根本就没有从menu里选择元素。你可以这么理解:链中的方法调用都在排队等待,直到调用collect。除了collect之外,所有这些操作都会返回另一个流,这样它们就可以接成一条流水线,于是就可以看作对源的一个查询。在本例中,我们先是对menu调用stream方法,由菜单得到一个流。流的简短定义就是“从支持数据处理操作的源生成的元素序列”。原创 2024-12-07 21:34:56 · 452 阅读 · 0 评论 -
4.1 流是什么
现在我想将这些菜以卡路里按升序排序,并收集卡路里小于400的菜名。是JavaAPI的新成员,它允许你以声明性方式处理数据集合。而这是使用流的Java8的写法。这是Java7的写法。原创 2024-12-07 21:34:17 · 357 阅读 · 0 评论
分享