跳至主要內容

元数据

Raoul-Gabriel Urma Mario Fusco Alan Mycroft约 3029 字大约 10 分钟...

元数据

[!abstract] Java 8实战

  •  Java 8实战|200
    Java 8实战|200
  • 书名: Java 8实战
  • 作者: Raoul-Gabriel Urma Mario Fusco Alan Mycroft
  • 简介: 本书全面介绍了Java 8 这个里程碑版本的新特性,包括Lambdas、流和函数式编程。有了函数式的编程特性,可以让代码更简洁,同时也能自动化地利用多核硬件。全书分四个部分:基础知识、函数式数据处理、高效Java 8 编程和超越Java 8,清晰明了地向读者展现了一幅Java 与时俱进的现代化画卷。
  • 出版时间: 2016-04-25 00:00:00
  • ISBN: 9787115419347
  • 分类: 计算机-编程设计
  • 出版社: 人民邮电出版社
  • PC地址:https://weread.qq.com/web/reader/faf32510718ff5e5fafd211open in new window

高亮划线

第1章 为什么要关心Java 8

📌 函数式编程风格
⏱ 2023-06-12 09:13:08 ^26211813-12-13872-13879

第2章 通过行为参数化传递代码

📌 它意味着拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行
⏱ 2023-06-25 09:15:40 ^26211813-13-1039-1100

📌 行为参数化的好处在于你可以把迭代要筛选的集合的逻辑与对集合中每个元素应用的行为区分开来。这样你可以重复使用同一个方法,给它不同的行为来达到不同的目的
⏱ 2023-06-19 09:58:14 ^26211813-13-8685-8759

第3章 Lambda表达式

📌 函数式接口就是只定义一个抽象方法的接口
⏱ 2023-07-04 22:14:55 ^26211813-14-6643-6662

📌 Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例
⏱ 2023-07-04 22:25:16 ^26211813-14-7838-7919

📌 函数式接口的抽象方法的签名基本上就是Lambda表达式的签名
⏱ 2023-07-04 22:25:58 ^26211813-14-8350-8380

📌 函数描述符
⏱ 2023-07-04 22:26:08 ^26211813-14-8413-8425

📌 Lambda表达式可以被赋给一个变量,或传递给一个接受函数式接口作为参数的方法就好了
⏱ 2023-07-04 22:29:11 ^26211813-14-9204-9246

📌 任何BufferedReader-> String形式的Lambda都可以作为参数来传递,因为它们符合BufferedReaderProcessor接口中定义的process方法的签名
⏱ 2023-07-05 09:11:34 ^26211813-14-13750-13842

📌 任何函数式接口都不允许抛出受检异常(checked exception)
⏱ 2023-07-05 09:52:19 ^26211813-14-21299-21335

📌 如果你需要Lambda表达式来抛出异常,有两种办法:定义一个自己的函数式接口,并声明受检异常,或者把Lambda包在一个try/catch块中。
⏱ 2023-07-05 09:53:59 ^26211813-14-21336-21408

📌 如果一个Lambda的主体是一个语句表达式,它就和一个返回void的函数描述符兼容
⏱ 2023-07-06 10:04:53 ^26211813-14-25257-25298

第4章 引入流

📌 可以访问特定元素类型的一组有序值
⏱ 2023-07-18 09:29:48 ^26211813-16-7434-7450

📌 从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致
⏱ 2023-07-18 09:29:55 ^26211813-16-7679-7715

📌 Streams库的内部迭代可以自动选择一种适合你硬件的数据表示和并行实现
⏱ 2023-07-19 10:07:58 ^26211813-16-14666-14702

📌 类似于Collection却没有迭代器的接口
⏱ 2023-07-19 10:07:36 ^26211813-16-14848-14870

📌 终端操作会从流的流水线生成结果。其结果是任何不是流的值
⏱ 2023-07-20 09:21:32 ^26211813-16-17371-17398

第5章 使用流

📌 Optional简介
Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在。在上面的代码中,findAny可能什么元素都没找到。Java 8的库设计人员引入了Optional<T>,这样就不用返回众所周知容易出问题的null了。我们在这里不会详细讨论Optional,因为第10章会详细解释你的代码如何利用Optional,避免和null检查相关的bug。不过现在,了解一下Optional里面几种可以迫使你显式地检查值是否存在或处理值不存在的情形的方法也不错。
❑ isPresent()将在Optional包含值的时候返回true,否则返回false。
❑ ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块。我们在第3章介绍了Consumer函数式接口;它让你传递一个接收T类型参数,并返回void的Lambda表达式。
❑ T get()会在值存在时返回值,否则抛出一个NoSuchElement异常。
❑ T orElse(T other)会在值存在时返回值,否则返回一个默认值。
⏱ 2023-11-24 08:53:52 ^26211813-17-13813

第6章 用流收集数据

📌 简洁的方法是把流映射到一个IntStream,然后调用sum方法,你也可以得到相同的结果:
⏱ 2023-12-01 08:47:24 ^26211813-18-13744-13789

📌 收集器在某种程度上比Stream接口上直接提供的方法用起来更复杂,但好处在于它们能提供更高水平的抽象和概括,也更容易重用和自定义。
⏱ 2023-12-01 08:48:01 ^26211813-18-14073-14138

第7章 并行数据处理与性能

📌 然而在软件工程上,靠猜绝对不是什么好办法!
⏱ 2023-12-28 09:22:44 ^26211813-19-4640-4661

📌 就是使用的算法改变了某些共享状态
⏱ 2023-12-28 10:08:31 ^26211813-19-9246-9262

📌 避免共享可变状态
⏱ 2023-12-28 10:07:44 ^26211813-19-11223-11231

📌 并行流并不总是比顺序流快
⏱ 2023-12-28 09:54:46 ^26211813-19-11639-11651

📌 用适当的基准来检查其性能
⏱ 2023-12-28 09:54:42 ^26211813-19-11701-11713

📌 留意装箱
⏱ 2023-12-28 09:54:57 ^26211813-19-11746-11750

📌 有些操作本身在并行流上的性能就比顺序流差
⏱ 2023-12-28 09:55:23 ^26211813-19-11869-11889

📌 还要考虑流的操作流水线的总计算成本
⏱ 2023-12-28 09:59:51 ^26211813-19-12159-12176

📌 并行处理少数几个元素的好处还抵不上并行化造成的额外开销。
⏱ 2023-12-28 10:00:06 ^26211813-19-12456-12484

📌 要考虑流背后的数据结构是否易于分解
⏱ 2023-12-28 10:03:03 ^26211813-19-12516-12533

📌 流自身的特点,以及流水线中的中间操作修改流的方式
⏱ 2023-12-28 10:04:41 ^26211813-19-12695-12719

📌 还要考虑终端操作中合并步骤的代价是大是小
⏱ 2023-12-28 10:05:00 ^26211813-19-12840-12860

第8章 重构、测试和调试

📌 我们很难定义什么是好的可读性,因为这可能非常主观
⏱ 2024-01-02 19:14:30 ^26211813-21-1761-1785

📌 别人理解这段代码的难易程度
⏱ 2024-01-02 19:14:43 ^26211813-21-1794-1807

📌 Lambda表达式有利于行为参数化
⏱ 2024-01-02 19:36:23 ^26211813-21-8188-8205

📌 淡定从容地面对需求的变化
⏱ 2024-01-02 19:36:33 ^26211813-21-8257-8269

📌 Lambda表达式避免了采用策略设计模式时僵化的模板代码
⏱ 2024-01-02 20:22:59 ^26211813-21-14255-14283

📌 那是因为需要执行的动作都很简单,因此才能很方便地消除僵化代码。但是,观察者的逻辑有可能十分复杂,它们可能还持有状态,抑或定义了多个方法,诸如此类。在这些情形下,你还是应该继续使用类的方式。
⏱ 2024-01-02 20:48:42 ^26211813-21-19891-19985

第9章 默认方法

📌 Java 8为了解决这一问题引入了一种新的机制。Java 8中的接口现在支持在声明方法的同时提供实现,这听起来让人惊讶!通过两种方式可以完成这种操作。其一,Java 8允许在接口内声明静态方法。其二,Java 8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。换句话说,接口能提供方法的具体实现。因此,实现接口的类如果不显式地提供该方法的具体实现,就会自动继承默认的实现。这种机制可以使你平滑地进行接口的优化和演进 ^26211813-22-996-1215

  • 💭 接口中声明静态方法和默认方法。 - ⏱ 2024-01-04 20:46:04

📌 简而言之,向接口添加方法是诸多问题的罪恶之源;一旦接口发生变化,实现这些接口的类往往也需要更新,提供新添方法的实现才能适配接口的变化。如果你对接口以及它所有相关的实现有完全的控制,这可能不是个大问题。但是这种情况是极少的。这就是引入默认方法的目的:它让类可以自动地继承接口的一个默认实现
⏱ 2024-01-05 09:09:57 ^26211813-22-2794-2937

📌 保持接口的精致性和正交性能帮助你在现有的代码基上最大程度地实现代码复用和行为组合。 ^26211813-22-13002-13043

  • 💭 保持接口的精致性和正交性能帮助你在现有的代码基上最大程度地实现代码复用和行为组合。 - ⏱ 2024-01-05 15:06:11

📌 如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断。
⏱ 2024-01-14 22:23:29 ^26211813-22-17492-17541

第10章 用Optional取代null

📌 了四个截然不同的退出点,使得代码的维护异常艰难
⏱ 2024-02-05 10:10:12 ^26211813-23-4485-4508

📌 变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空”的Optional对象,由方法Optional.empty()返回。
⏱ 2024-07-16 21:47:47 ^26211813-23-7752-7831

📌 你的代码中始终如一地使用Optional,能非常清晰地界定出变量值的缺失是结构上的问题,还是你算法上的缺陷,抑或是你数据中的问题。另外,我们还想特别强调,引入Optional类的意图并非要消除每一个null引用。与此相反,它的目标是帮助你更好地设计出普适的API,让程序员看到方法签名,就能了解它是否接受一个Optional的值。这种强制会让你更积极地将变量从Optional中解包出来,直面缺失的变量值。
⏱ 2024-03-11 09:52:08 ^26211813-23-9183-9386

读书笔记

第9章 默认方法

划线评论

📌 Java 8为了解决这一问题引入了一种新的机制。Java 8中的接口现在支持在声明方法的同时提供实现,这听起来让人惊讶!通过两种方式可以完成这种操作。其一,Java 8允许在接口内声明静态方法。其二,Java 8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。换句话说,接口能提供方法的具体实现。因此,实现接口的类如果不显式地提供该方法的具体实现,就会自动继承默认的实现。这种机制可以使你平滑地进行接口的优化和演进 ^37992928-7NYqMeXID
- 💭 接口中声明静态方法和默认方法。
- ⏱ 2024-01-04 20:46:41

划线评论

📌 保持接口的精致性和正交性能帮助你在现有的代码基上最大程度地实现代码复用和行为组合。 ^37992928-7NZANcWoe
- 💭 保持接口的精致性和正交性能帮助你在现有的代码基上最大程度地实现代码复用和行为组合。
- ⏱ 2024-01-05 15:06:17

本书评论

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.3.0