Java 8实战之读书笔记二:基础知识
好记性不如烂笔头,整理一些个人觉得比较重要的东西。
一、基础知识
第1章 为什么要关心Java 8
Java 8提供了一个新的API(称为“流”, Stream),它支持许多处理数据的并行操作,其思路
和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里
是Streams库)来选择最佳低级执行机制。
Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:
(1).把代码传递给方法的简洁方式(方法引用、 Lambda)
(2).接口中的默认方法。
Java 8也用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。
Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。
用行为参数化把代码传递给方法:
行为参数化:实现了把方法(你的代码)作为参数传递给另一个方法的能力。
把函数作为一等值。
第2章 通过行为参数化传递代码
示例:
public static boolean isGreenApple(Apple apple) {
return "green".equals(apple.getColor());
}
//java.util.function中有这个接口
public interface Predicate<T> {
boolean test(T t);
}
static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory){
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
//使用时:
filterApples(inventory, Apple::isGreenApple);
以下是你应从本章中学到的关键概念。
行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们, 完成不同行为的能力。
行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。
Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。
第3章 Lambda 表达式
函数式接口:只定义了一个抽象方法
@FunctionalInterface:用于表示该接口会设计成一个函数式接口。
//无装箱操作(推荐)
IntPredicate evenNumbers = (int i) -> i % 2 == 0;
evenNumbers.test(1000);
//装箱
Predicate<Integer> oddNumbers = (Integer i) -> i % 2 == 1;
oddNumbers.test(1000);
复合Lambda表达式的有用方法:
比较器复合:Comparator.comparing
.reversed()逆序,.thenComparing比较器链
谓词复合:negate()非,and,or
函数复合:.andThen(Function fun),.compose(Function fun)两者顺序相反
以下是你应从本章中学到的关键概念。
Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。
Lambda表达式让你可以简洁地传递代码。
函数式接口就是仅仅声明了一个抽象方法的接口。
只有在接受函数式接口的地方才可以使用Lambda表达式。
Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。
Java 8自带一些常用的函数式接口,放在java.util.function包里,包括Predicate<T>、 Function<T,R>、 Supplier<T>、 Consumer<T>和BinaryOperator<T>,如表3-2所述。
为了避免装箱操作,对Predicate<T>和Function<T, R>等通用函数式接口的原始类型
特化: IntPredicate、 IntToLongFunction等。
环绕执行模式(即在方法所必需的代码中间,你需要执行点儿什么操作,比如资源分配和清理)可以配合Lambda提高灵活性和可重用性。
Lambda表达式所需要代表的类型称为目标类型。
方法引用让你重复使用现有的方法实现并直接传递它们。
Comparator、 Predicate和Function等函数式接口都有几个可以用来结合Lambda表达式的默认方法。
Java 8实战之读书笔记二:基础知识的更多相关文章
- 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API
https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...
- Java 8实战之读书笔记一:内容简介
本书的主要内容如下: 如何使用Java 8新增的强大特性 如何编写能有效利用多核架构的程序 重构.测试和调试 怎样高效地应用函数式编程 目录: 第一部分 基础知识 第1 章 为什么要关心Jav ...
- Java 8实战之读书笔记三:函数式数据处理
二.函数式数据处理 第4章 引入流 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现). 示例: import static java.uti ...
- Java 8实战之读书笔记四:高效Java 8编程
三.高效Java 8编程 第8章 重构.测试和调试 Java 8的新特性也可以帮助提升代码的可读性: 使用Java 8,你可以减少冗长的代码,让代码更易于理解 通过方法引用和S ...
- 《R实战》读书笔记二
第一章 R简单介绍 本章概要 1安装R 2理解R语言 3执行R程序 本章所介绍的内容概括例如以下. 一个典型的数据分析步骤如图1所看到的. 图1:典型数据分析步骤 简而言之,现今的数据分析要求我们从多 ...
- Java 8实战之读书笔记五:超越Java 8
四.超越Java 8 第13章 函数式的思考 下面是这一章中你应该掌握的关键概念. 从长远看,减少共享的可变数据结构能帮助你降低维护和调试程序的代价. 函数式编程支持无副作用的 ...
- PILE读书笔记_基础知识
程序的构成 Linux下二进制可执行程序的格式一般为ELF格式. 我们可以用readelf命令来读取二进制的信息. ELF文件的主要内容就是由各个section及symbol表组成的. 下面来分别介绍 ...
- UNIX读书笔记----UNIX基础知识
UNIX体系结构: 从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心.图片显示了UNI ...
- 《Java编程思想》读书笔记(二)
三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...
随机推荐
- 12JSP进阶
1.EL表达式 1.1 简介 EL表达式替代jsp表达式.因为开发jsp页面的时候遵守原则:在jsp页面中尽量少些甚至不写java代码. EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果 ...
- 树——binary-tree-postorder-traversal(树的前序遍历)
问题: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...
- Windows结束某个端口的进程
1.打开cmd命令窗口,输入命令:netstat -ano | findstr 8080,根据端口号查找对应的PID.结果如下: 发现8080端口被PID(进程号)为2188的进程占用. 2.根据PI ...
- springboot框架中的各种 注解
使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springI ...
- django 多条数据显示的坑(怪自己)
今天的问题是,一个接口执行了很多次,每次都会在结果表里面记录一条结果信息,在查看接口详情页面,我想只展示一条,然后就进入误区了 第一个是怪自己手残,api_id 被自己写成app_id了 第二个是筛 ...
- Jenkins配置git/github 插件的ssh key
参考来源:http://jingyan.baidu.com/article/a65957f4f0acc624e67f9bc1.html 方式一:本地需要生成公私钥文件,git/github中新建ssh ...
- 【leetcode】301. Remove Invalid Parentheses
题目如下: 解题思路:还是这点经验,对于需要输出整个结果集的题目,对性能要求都不会太高.括号问题的解法也很简单,从头开始遍历输入字符串并对左右括号进行计数,其中出现右括号数量大于左括号数量的情况,表示 ...
- 04 全局配置,java 编意默认版本,1.6.修改配置
https://www.cnblogs.com/liu-s/p/5371289.html <!-- 修改Intellij Idea 创建maven项目默认Java编译版本 --> < ...
- elasticsearch-head插件添加安全认证
elasticsearch-head是集群管理.数据可视化.增删查改.查询语句可视化工具;它可以对数据进行增删查改,对于数据安全来说是有风险的,因此在生产环境中尽量少用,使用该插件至少要限制ip地址或 ...
- 13 October
树链剖分 http://www.lydsy.com/JudgeOnline/problem.php?id=1036 https://oi.men.ci/tree-chain-split-notes/. ...