Date: Wed, 19 May 2021 23:34:09 +0800
Subject: [PATCH 023/146] update readme
---
README.md | 70 ++++++++++++++++++++++++++-----------------------------
1 file changed, 33 insertions(+), 37 deletions(-)
diff --git a/README.md b/README.md
index c9b092f..0258f5a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-> **原创文章每周更新**。公众号首发。技术文字在写的过程中难免会有纰漏,或者细节不够完善。大家发现问题,可以及时给我 PR 反馈,也可以去 [公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7) 给我留言,或者加我 [微信](https://github.com/niumoo/JavaNotes#联系我) 直接说明,我都会及时更正,哪怕是一个错别字。加油!奥利给!
+> **原创文章每周更新**。技术文字在写的过程中难免会有纰漏,或者细节不够完善。大家发现问题,可以及时给我 PR 反馈,也可以去 [公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7) 给我留言,或者加我 [微信](https://github.com/niumoo/JavaNotes#联系我) 直接说明,我都会及时更正,哪怕是一个错别字。加油!奥利给!
+
+
Java Notes
@@ -15,21 +17,6 @@
文章内容也都可以访问网站 [www.wdbyte.com](https://www.wdbyte.com) 进行阅读。
-
-
-### 🔬 JDK 源码分析
-
-面试必备的 JDK 源码分析。探寻 JDK 大佬的设计思路。没有链接部分为后续更新内容,持续更新中。
-
-- [集合 -「源码分析」最通俗易懂的 HashMap 源码分析解读](https://mp.weixin.qq.com/s/q-rWq79HmzPe08gyfOjaIA)
-- [集合 -「源码分析」还不懂 ConcurrentHashMap ?这份源码分析了解一下](https://mp.weixin.qq.com/s/AHWzboztt53ZfFZmsSnMSw)
-- [集合 -「源码分析」ArrayList和LinkedList如何实现的?我看你还有机会!](https://mp.weixin.qq.com/s/_x3K_iK4ZimLL4qdS7UZ8Q)
-- [集合 -「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?](https://mp.weixin.qq.com/s/NbBUmNkp5JqDGp_WRA3GGA)
-- 集合 - HashSet & TreeSet & LinkedHashSet
-- 基础类 - Object
-- 基础类 - String
-- 基础类 - StringBuffer & StringBuilder
-
### 🌿 SpringBoot 2.x
下面所有 SpringBoot 2.x 文章对应的代码示例都在这里 [Github.com/niumoo/springboot](https://github.com/niumoo/springboot) 仓库。
@@ -47,12 +34,12 @@
- [Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控](https://mp.weixin.qq.com/s/lp-mmjocibzPB8-CnGSe4Q)
- [Springboot 系列(八)动态Banner与图片转字符图案的手动实现](https://mp.weixin.qq.com/s/nQq3KS7l2B9wr90aOe0cEw)
- [Springboot 系列(七)web 开发之异常错误处理机制剖析](https://mp.weixin.qq.com/s/AidIrbZm3FSWAqo5_2QE2g)
-- [Springboot 系列(六)web 开发之拦截器和三大组件](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-06-web-filter-apo-webbase.md) | [微信链接](https://mp.weixin.qq.com/s/yM87mQC4HQ5O_ZyunW0JkQ)
-- [Springboot 系列(五)web 开发之静态资源和模版引擎](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-05-web-static-template.md) | [微信链接](https://mp.weixin.qq.com/s/IFzyTlpkAyHY4Li4mPERKg)
-- [Springboot 系列(四)Spring Boot 日志框架](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-04-log.md) | [微信链接](https://mp.weixin.qq.com/s/fpSmM7fXFTVRV_5qP94xXw)
-- [Springboot 系列(三)Spring Boot 自动配置](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-03-auto-config.md) | [微信链接](https://mp.weixin.qq.com/s/fehMKv3DUTnB2w_0cSdnhQ)
-- [Springboot 系列(二)Spring Boot 配置文件](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-02-config.md) | [微信链接](https://mp.weixin.qq.com/s/g_yISWxL7mpGvqaT9uKa4g)
-- [Springboot 系列(一)Spring Boot 入门篇](https://github.com/niumoo/JavaNotes/blob/master/docs/springboot/springboot-01-quick-start.md) | [微信链接](https://mp.weixin.qq.com/s/iQapGQ3oErzBTxCvD7USNw)
+- [Springboot 系列(六)web 开发之拦截器和三大组件](https://mp.weixin.qq.com/s/yM87mQC4HQ5O_ZyunW0JkQ)
+- [Springboot 系列(五)web 开发之静态资源和模版引擎](https://mp.weixin.qq.com/s/IFzyTlpkAyHY4Li4mPERKg)
+- [Springboot 系列(四)Spring Boot 日志框架](https://mp.weixin.qq.com/s/fpSmM7fXFTVRV_5qP94xXw)
+- [Springboot 系列(三)Spring Boot 自动配置](https://mp.weixin.qq.com/s/fehMKv3DUTnB2w_0cSdnhQ)
+- [Springboot 系列(二)Spring Boot 配置文件](https://mp.weixin.qq.com/s/g_yISWxL7mpGvqaT9uKa4g)
+- [Springboot 系列(一)Spring Boot 入门篇](https://mp.weixin.qq.com/s/iQapGQ3oErzBTxCvD7USNw)
### ☕ Java 新特性
@@ -74,6 +61,19 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- [Java 7 新特性 - 还看不懂同事代码?快来补一波 Java 7 语法特性](https://mp.weixin.qq.com/s/fdW1wwcYgg0INixN4BtgbQ)
- [Java 7 新特性 - 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性](https://mp.weixin.qq.com/s/STux58HOjz4eAZ3sHYFVzw)
+### 🔬 JDK 源码分析
+
+面试必备的 JDK 源码分析。探寻 JDK 大佬的设计思路。没有链接部分为后续更新内容,持续更新中。
+
+- [集合 -「源码分析」最通俗易懂的 HashMap 源码分析解读](https://mp.weixin.qq.com/s/q-rWq79HmzPe08gyfOjaIA)
+- [集合 -「源码分析」还不懂 ConcurrentHashMap ?这份源码分析了解一下](https://mp.weixin.qq.com/s/AHWzboztt53ZfFZmsSnMSw)
+- [集合 -「源码分析」ArrayList和LinkedList如何实现的?我看你还有机会!](https://mp.weixin.qq.com/s/_x3K_iK4ZimLL4qdS7UZ8Q)
+- [集合 -「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?](https://mp.weixin.qq.com/s/NbBUmNkp5JqDGp_WRA3GGA)
+- 集合 - HashSet & TreeSet & LinkedHashSet
+- 基础类 - Object
+- 基础类 - String
+- 基础类 - StringBuffer & StringBuilder
+
### 💻 Java 并发编程
- 线程基础之通知、等待、休眠、让行、中断
@@ -130,6 +130,7 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
一款好用的工具,不仅可以装X,更可以让你事半功倍,准时下班。
+- [Java 反编译工具的使用与对比分析](https://mp.weixin.qq.com/s/YfmxrtMwNqJvEb0q-ti9sg)
- [可以Postman,也可以cURL.进来领略下cURL的独门绝技](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-curl.md) | [微信链接](https://mp.weixin.qq.com/s/jK4ctq5VQjw4oPSO0gEp6Q)
- [抛弃Eclipse,投入IDEA 的独孤求败江湖](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-idea-skill.md)| [微信链接](https://mp.weixin.qq.com/s/-jzzxd_eEmTGVntabhT-CA)
- [使用Apache Ant 进行Java web项目打包并部署至TOMCAT](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-apache-ant.md)| [网站链接](https://www.wdbyte.com/2017/11/develop/tool-apache-ant/)
@@ -139,22 +140,17 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- [Manjaro Linux 入门使用教程](https://github.com/niumoo/JavaNotes/blob/master/docs/linux/linux-manjaro.md)| [微信链接](https://mp.weixin.qq.com/s/ulueZbYaADsVbX23Fu-lzQ)
- [Ubuntu18 的超详细常用软件安装](https://github.com/niumoo/JavaNotes/blob/master/docs/linux/linux-ubuntu-start.md)| [微信链接](https://mp.weixin.qq.com/s/AKlVxkzwoyvcLDPPXlpm8g)
-### ⏳ 开发技巧
+### ⏳ Java 开发
+- [Java 中 RMI 的使用](https://mp.weixin.qq.com/s/O8TmNuu5buJVNbnT6JH98Q)
+- [我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?](https://mp.weixin.qq.com/s/-jgVDsVrq2kMGztP9RqMqw)
- [三种骚操作绕过迭代器遍历时的数据修改异常](https://mp.weixin.qq.com/s/jvrb75rlo8iZAZS7bTuPfw)
-
- [Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍](https://mp.weixin.qq.com/s/sKSsOi-IiLRIgb20KSrgcw)
-
-- [「1024」专属序猿的快乐,惊奇迷惑代码大赏](https://mp.weixin.qq.com/s/sKSsOi-IiLRIgb20KSrgcw)
-
+- [「1024」专属序猿的快乐,惊奇迷惑代码大赏](https://mp.weixin.qq.com/s/sKSsOi-IiLRIgb20KSrgcw)
- [一篇有趣的负载均衡算法实现](https://github.com/niumoo/JavaNotes/blob/master/docs/algorithm/负载均衡.md) | [微信链接](https://mp.weixin.qq.com/s/jNIxbw9sUPMZr_Fw_EFKFQ)
-
- [撸了个多线程断点续传下载器,我从中学习到了这些知识](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-java-download.md) | [微信链接](https://mp.weixin.qq.com/s/bI5xYq3jUtp-sviKlzHtNg)
-
- [Java 开发的编程噩梦,这些坑你没踩过算我输](https://github.com/niumoo/JavaNotes/blob/master/docs/java/java-think-code-standards.md) | [微信链接](https://mp.weixin.qq.com/s/6JZjVO3rj5WRgdc88XfA0w)
-
- [如何使用 Lombok 进行优雅的编码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-Lombok.md)| [网站链接](https://www.wdbyte.com/2018/12/develop/tool-Lombok/)
-
- [使用MyBatis Generator自动生成Model、Dao、Mapper相关代码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-mybatis-generator.md)| [网站链接](https://www.wdbyte.com/2017/11/develop/tool-mybatis-generator/)
### 💬 消息中间件
@@ -174,21 +170,21 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
### 🏃 我的痕迹
+我的网站:[https://www.wdbyte.com/](https://www.wdbyte.com/)
+
GitHub:[https://github.com/niumoo](https://github.com/niumoo)
CSDN:[https://niumoo.blog.csdn.net/](https://niumoo.blog.csdn.net/)
博客园:[https://www.cnblogs.com/niumoo/](https://www.cnblogs.com/niumoo/)
-掘 金:[https://juejin.im/user/5a62d481f265da3e2a0dac9b](https://juejin.im/user/5a62d481f265da3e2a0dac9b)
+掘 金:[https://juejin.im/user/5a62d481f265da3e2a0dac9b](https://juejin.im/user/5a62d481f265da3e2a0dac9b)
-思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
+思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
-知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
-
-我的网站:[https://www.wdbyte.com/](https://www.wdbyte.com/)
+知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
-公众号:微信搜索「 **未读代码** 」每一篇文字都会都先在公众号进行发布。
+公众号: **未读代码**
### 联系我
From d953b46b8a97cab8654ce03b290f9bdab3e0ee29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E4=BB=A3=E7=A0=81?=
Date: Tue, 3 Aug 2021 00:31:13 +0800
Subject: [PATCH 024/146] Update README.md
---
README.md | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 0258f5a..d663753 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,13 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- [Java 11 新特性介绍](https://mp.weixin.qq.com/s/hmuiDzLG7gakeVjvaKV6UA)
- [Java 10 新特性讲解](https://mp.weixin.qq.com/s/0ecCpeoeNRB8RLKvD9ktdQ)
- [Java 09 新特性讲解](https://mp.weixin.qq.com/s/qQ9qysceiJdu9sYpl-7W6A)
+- [Java 8 函数接口 UnaryOperator ](java8/java8-unaryoperaotr)
+- [Java 8 函数接口 BiPredicate ](/java8/java8-bipredicate)
+- [Java 8 函数接口 BiFunction ](/java8/java8-bifunction/)
+- [Java 8 函数接口 Supplier ](/java8/java8-supplier/)
+- [Java 8 函数接口 Predicate ](/java8/java8-predicate/)
+- [Java 8 函数接口 Function ](/java8/java8-function/)
+- [Java 8 新特性 - forEach 遍历](/java8/java8-foreach/)
- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://mp.weixin.qq.com/s/qKowwsJNd4PUaZ1XVbTBNQ)
- [Java 8 新特性 - 还看不懂同事的代码?Lambda 表达式、函数接口了解一下](https://mp.weixin.qq.com/s/FPKyOyiKPQBLdrF0bf9nHw)
- [Java 8 新特性 - 新的时间处理姿势还不了解一下?](https://mp.weixin.qq.com/s/bbuItfxLgemJRuFb6iqWzA)
@@ -174,23 +181,21 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
GitHub:[https://github.com/niumoo](https://github.com/niumoo)
-CSDN:[https://niumoo.blog.csdn.net/](https://niumoo.blog.csdn.net/)
+CSDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
博客园:[https://www.cnblogs.com/niumoo/](https://www.cnblogs.com/niumoo/)
掘 金:[https://juejin.im/user/5a62d481f265da3e2a0dac9b](https://juejin.im/user/5a62d481f265da3e2a0dac9b)
-思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
-
知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
-公众号: **未读代码**
+思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
### 联系我
可以添加我的微信 wn8398 一起交流。
-
+
### 公众号
@@ -198,4 +203,5 @@ CSDN:[https://niumoo.blog.csdn.net/](https://niumoo.blog.csdn.net/)
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注「 **未读代码** 」公众号。
-
+
+
From 64b631e9116bf6afc8d654ae32b375832b05beb0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E4=BB=A3=E7=A0=81?=
Date: Wed, 4 Aug 2021 13:02:33 +0800
Subject: [PATCH 025/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d663753..09c1473 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
目录中没有链接的部分,后续更新,感谢你的 STAR ,有问题或者建议可以[一起完善](https://github.com/niumoo/JavaNotes#-%E8%B4%A1%E7%8C%AE%E4%B8%8E%E5%BB%BA%E8%AE%AE)。
-文章内容也都可以访问网站 [www.wdbyte.com](https://www.wdbyte.com) 进行阅读。
+文章内容也都可以访问网站 [https://www.wdbyte.com](https://www.wdbyte.com) 进行阅读。
### 🌿 SpringBoot 2.x
From 8ffd1b992d68a3a3c07703392352373a7898534e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E4=BB=A3=E7=A0=81?=
Date: Wed, 4 Aug 2021 13:48:25 +0800
Subject: [PATCH 026/146] Update README.md
---
README.md | 199 ++++++++++++++++++++++++++++--------------------------
1 file changed, 104 insertions(+), 95 deletions(-)
diff --git a/README.md b/README.md
index 09c1473..d54a183 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -17,71 +17,77 @@
文章内容也都可以访问网站 [https://www.wdbyte.com](https://www.wdbyte.com) 进行阅读。
-### 🌿 SpringBoot 2.x
-
-下面所有 SpringBoot 2.x 文章对应的代码示例都在这里 [Github.com/niumoo/springboot](https://github.com/niumoo/springboot) 仓库。
-
-- [Springboot 系列(十九)SpringBoot 的多数据源配置](https://mp.weixin.qq.com/s/4at3FyunITJPRO6WHa9BEQ)
-- [Springboot 系列(十八)最详细的 Spring Boot 多模块开发与排坑指南](https://mp.weixin.qq.com/s/4ffDc99rzUEM3c4ZoTHsIA)
-- [Springboot 系列(十七)迅速使用 Spring Boot Admin 监控你的 Spring Boot 程序](https://mp.weixin.qq.com/s/AwlTf2MIx_Rp8jL4CcX3AA)
-- [Springboot 系列(十六)你真的了解 Swagger 文档吗?](https://mp.weixin.qq.com/s/fE9-SI6mJzMD2S9TpKRyAg)
-- [Springboot 系列(十五)如何编写自己的 Springboot starter](https://mp.weixin.qq.com/s/V-uPpfNxnhXRNa6ExfUD-A)
-- [Springboot 系列(十四)迅速启用 HTTPS 加密你的网站](https://mp.weixin.qq.com/s/TwL_IRTzN9wubuw0ddXZbQ)
-- [Springboot 系列(十三)使用邮件服务](https://mp.weixin.qq.com/s/WTpc6A39ikZR_uM6sUf1CA)
-- [Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件](https://mp.weixin.qq.com/s/Eij-GU3yQijyYmQcsghsgg)
-- [Springboot 系列(十一)使用 Mybatis(自动生成插件) 访问数据库](https://mp.weixin.qq.com/s/-8ytSdjKGmukdNKx_f0jLw)
-- [Springboot 系列(十)使用 Spring data jpa 访问数据库](https://mp.weixin.qq.com/s/oyD4P074A0wj7rU5rB4EFw)
-- [Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控](https://mp.weixin.qq.com/s/lp-mmjocibzPB8-CnGSe4Q)
-- [Springboot 系列(八)动态Banner与图片转字符图案的手动实现](https://mp.weixin.qq.com/s/nQq3KS7l2B9wr90aOe0cEw)
-- [Springboot 系列(七)web 开发之异常错误处理机制剖析](https://mp.weixin.qq.com/s/AidIrbZm3FSWAqo5_2QE2g)
-- [Springboot 系列(六)web 开发之拦截器和三大组件](https://mp.weixin.qq.com/s/yM87mQC4HQ5O_ZyunW0JkQ)
-- [Springboot 系列(五)web 开发之静态资源和模版引擎](https://mp.weixin.qq.com/s/IFzyTlpkAyHY4Li4mPERKg)
-- [Springboot 系列(四)Spring Boot 日志框架](https://mp.weixin.qq.com/s/fpSmM7fXFTVRV_5qP94xXw)
-- [Springboot 系列(三)Spring Boot 自动配置](https://mp.weixin.qq.com/s/fehMKv3DUTnB2w_0cSdnhQ)
-- [Springboot 系列(二)Spring Boot 配置文件](https://mp.weixin.qq.com/s/g_yISWxL7mpGvqaT9uKa4g)
-- [Springboot 系列(一)Spring Boot 入门篇](https://mp.weixin.qq.com/s/iQapGQ3oErzBTxCvD7USNw)
-
-### ☕ Java 新特性
+## 🌿 SpringBoot 2.x 教程
-Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
+使用 **Spring Boot** 可以快速的创建一个基于Spring 的、独立的、生产级的应用程序,并且可以直接运行。Spring Boot 采用习惯性配置,整合大量 Spring 组建和第三方库,让你只需要少量的修改就可以轻松上手。
+
+- [Spring Boot 系列(一)Spring Boot 入门篇](https://www.wdbyte.com/2019/01/springboot/springboot01-quick-start/)
+- [Spring Boot 系列(二)Spring Boot 配置文件](https://www.wdbyte.com/2019/01/springboot/springboot01-config/)
+- [Spring Boot 系列(三)Spring Boot 自动配置](https://www.wdbyte.com/2019/01/springboot/springboot03-auto-config/)
+- [Spring Boot 系列(四)Spring Boot 日志框架](https://www.wdbyte.com/2019/01/springboot/springboot04-log/)
+- [Spring Boot 系列(五)web 开发之静态资源和模版引擎](https://www.wdbyte.com/2019/02/springboot/springboot-05-web-static-template/)
+- [Spring Boot 系列(六)web 开发之拦截器和三大组件](https://www.wdbyte.com/2019/02/springboot/springboot-06-web-filter-apo-webbase/)
+- [Spring Boot 系列(七)web 开发之异常错误处理机制剖析](https://www.wdbyte.com/2019/02/springboot/springboot-07-web-exception/)
+- [Spring Boot 系列(八)动态 Banner 与图片转字符图案的手动实现](https://www.wdbyte.com/2019/02/springboot/springboot-08-banner/)
+- [Spring Boot 系列(九)使用 Spring JDBC 和 Druid 数据源监控](https://www.wdbyte.com/2019/02/springboot/springboot-09-data-jdbc/)
+- [Spring Boot 系列(十)使用 Spring data jpa 访问数据库](https://www.wdbyte.com/2019/03/springboot/springboot-10-data-jpa/)
+- [Spring Boot 系列(十一)使用 Mybatis(自动生成插件) 访问数据库](https://www.wdbyte.com/2019/03/springboot/springboot-11-data-mybatis/)
+- [Spring Boot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件](https://www.wdbyte.com/2019/03/springboot/springboot-12-data-mybatis-page/)
+- [Spring Boot 系列(十三)使用邮件服务](https://www.wdbyte.com/2019/03/springboot/springboot-13-email/)
+- [Spring Boot 系列(十四)迅速启用 HTTPS 加密你的网站](https://www.wdbyte.com/2019/08/springboot/springboot-14-https/)
+- [Spring Boot 系列(十五)如何编写自己的 Springboot starter](https://www.wdbyte.com/2019/11/springboot/springboot-15-my-starter/)
+- [Spring Boot 系列(十六)你真的了解 Swagger 文档吗?](https://www.wdbyte.com/2019/11/springboot/springboot-16-web-swagger/)
+- [Spring Boot 系列(十七)迅速使用 Spring Boot Admin 监控你的 Spring Boot 程序](https://www.wdbyte.com/2019/12/springboot/springboot-17-admin/)
+- [Spring Boot 系列(十八)最详细的 Spring Boot 多模块开发与排坑指南](https://www.wdbyte.com/2020/03/springboot/springboot-18-module/)
+- [Spring Boot 系列(十九)SpringBoot 的多数据源配置](https://www.wdbyte.com/2020/12/springboot/springboot-multiple-datasource/)
+
+
+以上 Spring Boot 文章源码:[Github.com/niumoo/springboot](https://github.com/niumoo/springboot/)
-持续更新中,下面所有文字的代码演示和 Demo 都在这里 [Github.com/niumoo/jdk-feature](https://github.com/niumoo/jdk-feature).
+## ☕ Java 新特性
+
+Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
- Java 15 新特性讲解
- Java 14 新特性讲解
- Java 13 新特性讲解
-- [Java 12 新特性讲解](https://mp.weixin.qq.com/s/V_MLtqzxa9ijgW6w6Pqocg)
-- [Java 11 新特性介绍](https://mp.weixin.qq.com/s/hmuiDzLG7gakeVjvaKV6UA)
-- [Java 10 新特性讲解](https://mp.weixin.qq.com/s/0ecCpeoeNRB8RLKvD9ktdQ)
-- [Java 09 新特性讲解](https://mp.weixin.qq.com/s/qQ9qysceiJdu9sYpl-7W6A)
-- [Java 8 函数接口 UnaryOperator ](java8/java8-unaryoperaotr)
-- [Java 8 函数接口 BiPredicate ](/java8/java8-bipredicate)
-- [Java 8 函数接口 BiFunction ](/java8/java8-bifunction/)
-- [Java 8 函数接口 Supplier ](/java8/java8-supplier/)
-- [Java 8 函数接口 Predicate ](/java8/java8-predicate/)
-- [Java 8 函数接口 Function ](/java8/java8-function/)
-- [Java 8 新特性 - forEach 遍历](/java8/java8-foreach/)
-- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://mp.weixin.qq.com/s/qKowwsJNd4PUaZ1XVbTBNQ)
-- [Java 8 新特性 - 还看不懂同事的代码?Lambda 表达式、函数接口了解一下](https://mp.weixin.qq.com/s/FPKyOyiKPQBLdrF0bf9nHw)
-- [Java 8 新特性 - 新的时间处理姿势还不了解一下?](https://mp.weixin.qq.com/s/bbuItfxLgemJRuFb6iqWzA)
-- [Java 8 新特性 - 使用 Optional优雅的处理空指针?](https://mp.weixin.qq.com/s/nPcqSgNkLrxdfqX8RWmCgA)
-- [Java 7 新特性 - 还看不懂同事代码?快来补一波 Java 7 语法特性](https://mp.weixin.qq.com/s/fdW1wwcYgg0INixN4BtgbQ)
-- [Java 7 新特性 - 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性](https://mp.weixin.qq.com/s/STux58HOjz4eAZ3sHYFVzw)
-
-### 🔬 JDK 源码分析
+- [Java 12 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk12-feature/)
+- [Java 11 新特性介绍](https://www.wdbyte.com/2020/03/jdk/jdk11-feature/)
+- [Java 10 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk10-feature/)
+- [Java 9 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk9-feature/)
+- [Java 8 函数接口 UnaryOperator ](https://www.wdbyte.com/java8/java8-unaryoperaotr)
+- [Java 8 函数接口 BiPredicate ](https://www.wdbyte.com/java8/java8-bipredicate)
+- [Java 8 函数接口 BiFunction ](https://www.wdbyte.com/java8/java8-bifunction/)
+- [Java 8 函数接口 Supplier ](https://www.wdbyte.com/java8/java8-supplier/)
+- [Java 8 函数接口 Predicate ](https://www.wdbyte.com/java8/java8-predicate/)
+- [Java 8 函数接口 Function ](https://www.wdbyte.com/java8/java8-function/)
+- [Java 8 新特性 - forEach 遍历](https://www.wdbyte.com/java8/java8-foreach/)
+
+- [Java 8 LocalDate、LocalDateTime 时间处理介绍](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
+- [Java 8 使用 Optional优雅的处理空指针](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
+- [Java 8 新特性 - Lambda 表达式、函数接口了解一下](https://www.wdbyte.com/2019/11/jdk/jdk8-lambda/)
+- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://www.wdbyte.com/2019/11/jdk/jdk8-stream/)
+- [Java 7 新特性 - 和低效 IO 说再见,Files,Paths,Path 文件操作介绍](https://www.wdbyte.com/2020/09/jdk/jdk7-file-pahs/)
+- [Java 7 新特性 - 新特性 - 快来补一波 Java 7 语法特性](https://www.wdbyte.com/2020/01/jdk/jdk7-start/)
+
+以上 Java 新功能文章源码: [Github.com/niumoo/jdk-feature](https://github.com/niumoo/jdk-feature)
+
+## 🔬 JDK 源码分析
面试必备的 JDK 源码分析。探寻 JDK 大佬的设计思路。没有链接部分为后续更新内容,持续更新中。
-- [集合 -「源码分析」最通俗易懂的 HashMap 源码分析解读](https://mp.weixin.qq.com/s/q-rWq79HmzPe08gyfOjaIA)
-- [集合 -「源码分析」还不懂 ConcurrentHashMap ?这份源码分析了解一下](https://mp.weixin.qq.com/s/AHWzboztt53ZfFZmsSnMSw)
-- [集合 -「源码分析」ArrayList和LinkedList如何实现的?我看你还有机会!](https://mp.weixin.qq.com/s/_x3K_iK4ZimLL4qdS7UZ8Q)
-- [集合 -「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?](https://mp.weixin.qq.com/s/NbBUmNkp5JqDGp_WRA3GGA)
-- 集合 - HashSet & TreeSet & LinkedHashSet
+- [集合 -「源码分析」CopyOnWriteArrayList 中的隐藏的知识,你Get了吗?](https://www.wdbyte.com/2020/10/jdk/src-copyonwritearraylist/)
+- [集合 -「源码分析」ArrayList和LinkedList如何实现的?我看你还有机会!](https://www.wdbyte.com/2020/08/jdk/src-arraylist-linkedlist/)
+- [集合 -「源码分析」还不懂 ConcurrentHashMap ?这份源码分析了解一下](https://www.wdbyte.com/2020/04/jdk/concurrent-hashmap/)
+- [集合 -「源码分析」最通俗易懂的 HashMap 源码分析解读](https://www.wdbyte.com/2020/03/jdk/hashmap/)
+- 集合 -「源码分析」TreeSet
+- 集合 -「源码分析」LinkedHashSet
- 基础类 - Object
- 基础类 - String
- 基础类 - StringBuffer & StringBuilder
-### 💻 Java 并发编程
+
+## 💻 Java 并发编程
- 线程基础之通知、等待、休眠、让行、中断
- ThreadLocal
@@ -100,7 +106,7 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- 同步器 CountDownLatch、CyclicBarrier、Semaphore
- Java 并发编程注意事项
-### 🕹 Java 虚拟机
+## 🕹 Java 虚拟机
- Java 内存模型
- 垃圾回收算法
@@ -112,13 +118,13 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- 前端编译 & 后端编译 & 优化
- 锁的自动优化升级策略
-### 🔍 Java 性能分析
+## 🔍 Java 性能分析
-- [JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!](https://mp.weixin.qq.com/s/-0enKREKarGRipk0PkXgBA)
-- [Arthas - Java 线上问题定位处理的终极利器](https://mp.weixin.qq.com/s/AZSlr2mWXL1-GFOBYVBA1g)
-- [超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下](https://mp.weixin.qq.com/s/Fvacprgk7fYvo7qS1liHDg)
+- [JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!](https://www.wdbyte.com/2020/08/develop/tool-jmh/)
+- [Arthas - Java 线上问题定位处理的终极利器](https://www.wdbyte.com/2019/11/arthas/)
+- [超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下](https://www.wdbyte.com/2019/12/async-profiler/)
-### 🧱 数据结构
+## 🧱 数据结构
- 数组
- 栈
@@ -129,7 +135,22 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- 堆
- 图
-### 🧰 工具技巧
+## ⏳ Java 开发
+
+- [Java 中 RMI 的使用](https://www.wdbyte.com/2021/05/java/java-rmi/)
+- [如何使用 Github Actions 自动抓取每日必应壁纸?](https://www.wdbyte.com/2021/03/bing-wallpaper-github-action/)
+- [三种骚操作绕过迭代器遍历时的数据修改异常](https://www.wdbyte.com/2021/02/develop/interator-update/)
+- [Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍](https://www.wdbyte.com/2020/10/develop/google-guava/)
+- [「1024」专属序猿的快乐,惊奇迷惑代码大赏](https://www.wdbyte.com/2020/10/2020-1024/)
+- [一篇有趣的负载均衡算法实现](https://www.wdbyte.com/2020/05/algorithm/load-balancing/)
+- [撸了个多线程断点续传下载器,我从中学习到了这些知识](https://www.wdbyte.com/2020/07/tool/java-download/)
+
+- [Java 开发的编程噩梦,这些坑你没踩过算我输](https://www.wdbyte.com/2020/08/java/java-code-standards/)
+- [如何使用 Lombok 进行优雅的编码](https://www.wdbyte.com/2018/12/develop/tool-lombok/)
+- [如何使用 Lombok 进行优雅的编码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-Lombok.md)| [网站链接](https://www.wdbyte.com/2018/12/develop/tool-Lombok/)
+- [使用MyBatis Generator自动生成Model、Dao、Mapper相关代码](https://www.wdbyte.com/2017/11/develop/tool-mybatis-generator/)
+
+## 🧰 工具技巧
>“工欲善其事,必先利其器”
>出处:孔子《论语》
@@ -137,51 +158,40 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
一款好用的工具,不仅可以装X,更可以让你事半功倍,准时下班。
-- [Java 反编译工具的使用与对比分析](https://mp.weixin.qq.com/s/YfmxrtMwNqJvEb0q-ti9sg)
-- [可以Postman,也可以cURL.进来领略下cURL的独门绝技](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-curl.md) | [微信链接](https://mp.weixin.qq.com/s/jK4ctq5VQjw4oPSO0gEp6Q)
-- [抛弃Eclipse,投入IDEA 的独孤求败江湖](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-idea-skill.md)| [微信链接](https://mp.weixin.qq.com/s/-jzzxd_eEmTGVntabhT-CA)
-- [使用Apache Ant 进行Java web项目打包并部署至TOMCAT](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-apache-ant.md)| [网站链接](https://www.wdbyte.com/2017/11/develop/tool-apache-ant/)
-- [Linux配置Tomcat的单机多实例](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-install-tomcat-many-instance.md)| [网站链接](https://www.wdbyte.com/2018/08/develop/install-tomcat-many-instance/)
-- [Linux定时任务crontab的使用](https://github.com/niumoo/JavaNotes/blob/master/docs/linux/linux-crontab.md)| [网站链接](https://www.wdbyte.com/2018/05/linux/linux-crontab/)
-- [原来热加载如此简单,手动写一个 Java 热加载吧](https://www.wdbyte.com/2019/10/jvm/java-hotput/)| [微信链接](https://mp.weixin.qq.com/s/Dpz1x_UyXeIMiA2hc7wZUw)
-- [Manjaro Linux 入门使用教程](https://github.com/niumoo/JavaNotes/blob/master/docs/linux/linux-manjaro.md)| [微信链接](https://mp.weixin.qq.com/s/ulueZbYaADsVbX23Fu-lzQ)
-- [Ubuntu18 的超详细常用软件安装](https://github.com/niumoo/JavaNotes/blob/master/docs/linux/linux-ubuntu-start.md)| [微信链接](https://mp.weixin.qq.com/s/AKlVxkzwoyvcLDPPXlpm8g)
-
-### ⏳ Java 开发
-
-- [Java 中 RMI 的使用](https://mp.weixin.qq.com/s/O8TmNuu5buJVNbnT6JH98Q)
-- [我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?](https://mp.weixin.qq.com/s/-jgVDsVrq2kMGztP9RqMqw)
-- [三种骚操作绕过迭代器遍历时的数据修改异常](https://mp.weixin.qq.com/s/jvrb75rlo8iZAZS7bTuPfw)
-- [Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍](https://mp.weixin.qq.com/s/sKSsOi-IiLRIgb20KSrgcw)
-- [「1024」专属序猿的快乐,惊奇迷惑代码大赏](https://mp.weixin.qq.com/s/sKSsOi-IiLRIgb20KSrgcw)
-- [一篇有趣的负载均衡算法实现](https://github.com/niumoo/JavaNotes/blob/master/docs/algorithm/负载均衡.md) | [微信链接](https://mp.weixin.qq.com/s/jNIxbw9sUPMZr_Fw_EFKFQ)
-- [撸了个多线程断点续传下载器,我从中学习到了这些知识](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-java-download.md) | [微信链接](https://mp.weixin.qq.com/s/bI5xYq3jUtp-sviKlzHtNg)
-- [Java 开发的编程噩梦,这些坑你没踩过算我输](https://github.com/niumoo/JavaNotes/blob/master/docs/java/java-think-code-standards.md) | [微信链接](https://mp.weixin.qq.com/s/6JZjVO3rj5WRgdc88XfA0w)
-- [如何使用 Lombok 进行优雅的编码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-Lombok.md)| [网站链接](https://www.wdbyte.com/2018/12/develop/tool-Lombok/)
-- [使用MyBatis Generator自动生成Model、Dao、Mapper相关代码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-mybatis-generator.md)| [网站链接](https://www.wdbyte.com/2017/11/develop/tool-mybatis-generator/)
-### 💬 消息中间件
+- [Java 反编译工具的使用与对比分析](https://www.wdbyte.com/2021/05/java-decompiler/)
+- [可以Postman,也可以cURL.进来领略下cURL的独门绝技](https://www.wdbyte.com/2020/06/tool/curl/)
+- [抛弃Eclipse,投入IDEA 的独孤求败江湖](https://www.wdbyte.com/2019/10/develop/idea-skill/)
+- [使用Apache Ant 进行Java web项目打包并部署至TOMCAT](https://www.wdbyte.com/2017/11/develop/tool-apache-ant/)
+- [Linux配置Tomcat的单机多实例](https://www.wdbyte.com/2018/08/develop/install-tomcat-many-instance/)
+- [Linux定时任务crontab的使用](https://www.wdbyte.com/2018/05/linux/linux-crontab/)
+- [原来热加载如此简单,手动写一个 Java 热加载吧](https://www.wdbyte.com/2019/10/jvm/java-hotput/)
+- [Manjaro Linux 入门使用教程](https://www.wdbyte.com/2020/04/linux/linux-manjaro/)
+- [Ubuntu18 的超详细常用软件安装](https://www.wdbyte.com/2018/11/linux/start-ubuntu/)
-- [消息队列中间件(三)Kafka 入门指南](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/mq-kafka-introduction.md)| [微信链接](https://mp.weixin.qq.com/s/FtVl7ZJXetA95c_9BtsXhg)
-- [消息队列中间件(二)使用 ActiveMQ](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/mq-activemq.md) | [微信链接](https://mp.weixin.qq.com/s/D0sclKz2gGUvllISjqHgyw)
-- [消息队列中间件(一)介绍](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/mq-introduction.md) | [微信链接](https://mp.weixin.qq.com/s/Gg3STCrnLsormMl1HyZrrQ)
-- [IO通信模型(三)多路复用IO](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/io-nio-selector.md) | [微信链接](https://mp.weixin.qq.com/s/4Xqk17NRlx56XfzSRhTNPA)
-- [IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/io-bon-blocking.md) | [微信链接](https://mp.weixin.qq.com/s/lad3Ot2LQy6DEwMBH5NW1g)
-- [IO通信模型(一)同步阻塞模式BIO(Blocking IO)](https://github.com/niumoo/JavaNotes/blob/master/docs/mq/io-blocking.md) | [微信链接](https://mp.weixin.qq.com/s/1-8fMMIGxKiyXG6852xpaA)
+## 💬 消息中间件
-### 🗺 贡献与建议
+- [消息队列中间件(三)Kafka 入门指南](https://www.wdbyte.com/2018/12/io/mq-kafka-introduction/)
+- [消息队列中间件(二)使用 ActiveMQ](https://www.wdbyte.com/2018/12/io/mq-activemq/)
+- [消息队列中间件(一)介绍](https://www.wdbyte.com/2018/11/io/mq-introduction/)
+- [IO通信模型(三)多路复用IO](https://www.wdbyte.com/2018/10/io/io3-nio/)
+- [IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)](https://www.wdbyte.com/2018/10/io/io2-nio/)
+- [IO通信模型(一)同步阻塞模式BIO(Blocking IO)](https://www.wdbyte.com/2018/10/io/io1-bio/)
+
+
+## 🗺 贡献与建议
1. 内容难免存在笔误,一个错别字,一个语法错误,都是贡献。
2. 文章中的错误和不足,或者不完善的地方都可以进行补充或者修改。
3. 我没有涉及到的知识点,也可以进行补充。
-### 🏃 我的痕迹
+## 🏃 我的痕迹
我的网站:[https://www.wdbyte.com/](https://www.wdbyte.com/)
GitHub:[https://github.com/niumoo](https://github.com/niumoo)
-CSDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
+C SDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
博客园:[https://www.cnblogs.com/niumoo/](https://www.cnblogs.com/niumoo/)
@@ -195,7 +205,7 @@ CSDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
可以添加我的微信 wn8398 一起交流。
-
+
### 公众号
@@ -203,5 +213,4 @@ CSDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注「 **未读代码** 」公众号。
-
-
+
From 72c78e59dde22af57aaec26e401f23b59cbe181d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Thu, 5 Aug 2021 20:59:25 +0800
Subject: [PATCH 027/146] Update README.md
---
README.md | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index d54a183..54aa33f 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,7 @@
文章内容也都可以访问网站 [https://www.wdbyte.com](https://www.wdbyte.com) 进行阅读。
+
## 🌿 SpringBoot 2.x 教程
使用 **Spring Boot** 可以快速的创建一个基于Spring 的、独立的、生产级的应用程序,并且可以直接运行。Spring Boot 采用习惯性配置,整合大量 Spring 组建和第三方库,让你只需要少量的修改就可以轻松上手。
@@ -63,8 +64,8 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- [Java 8 函数接口 Function ](https://www.wdbyte.com/java8/java8-function/)
- [Java 8 新特性 - forEach 遍历](https://www.wdbyte.com/java8/java8-foreach/)
-- [Java 8 LocalDate、LocalDateTime 时间处理介绍](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
-- [Java 8 使用 Optional优雅的处理空指针](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
+- [Java 8 新特性 - LocalDate、LocalDateTime 时间处理介绍](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
+- [Java 8 新特性 - 使用 Optional优雅的处理空指针](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
- [Java 8 新特性 - Lambda 表达式、函数接口了解一下](https://www.wdbyte.com/2019/11/jdk/jdk8-lambda/)
- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://www.wdbyte.com/2019/11/jdk/jdk8-stream/)
- [Java 7 新特性 - 和低效 IO 说再见,Files,Paths,Path 文件操作介绍](https://www.wdbyte.com/2020/09/jdk/jdk7-file-pahs/)
@@ -147,7 +148,6 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- [Java 开发的编程噩梦,这些坑你没踩过算我输](https://www.wdbyte.com/2020/08/java/java-code-standards/)
- [如何使用 Lombok 进行优雅的编码](https://www.wdbyte.com/2018/12/develop/tool-lombok/)
-- [如何使用 Lombok 进行优雅的编码](https://github.com/niumoo/JavaNotes/blob/master/docs/tool/tool-Lombok.md)| [网站链接](https://www.wdbyte.com/2018/12/develop/tool-Lombok/)
- [使用MyBatis Generator自动生成Model、Dao、Mapper相关代码](https://www.wdbyte.com/2017/11/develop/tool-mybatis-generator/)
## 🧰 工具技巧
@@ -187,19 +187,20 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
## 🏃 我的痕迹
-我的网站:[https://www.wdbyte.com/](https://www.wdbyte.com/)
+1. 我的网站:[https://www.wdbyte.com/](https://www.wdbyte.com/)
+
+2. GitHub:[https://github.com/niumoo](https://github.com/niumoo)
-GitHub:[https://github.com/niumoo](https://github.com/niumoo)
+3. C SDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
-C SDN:[https://blog.csdn.net/u013735734](https://blog.csdn.net/u013735734)
+4. 博客园:[https://www.cnblogs.com/niumoo/](https://www.cnblogs.com/niumoo/)
-博客园:[https://www.cnblogs.com/niumoo/](https://www.cnblogs.com/niumoo/)
+5. 掘 金:[https://juejin.im/user/5a62d481f265da3e2a0dac9b](https://juejin.im/user/5a62d481f265da3e2a0dac9b)
-掘 金:[https://juejin.im/user/5a62d481f265da3e2a0dac9b](https://juejin.im/user/5a62d481f265da3e2a0dac9b)
+6. 知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
-知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
+7. 思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
-思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
### 联系我
From 8cc93f1df0728f69b551a11c137ae1666f0d2e7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Mon, 9 Aug 2021 10:56:46 +0800
Subject: [PATCH 028/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 54aa33f..f518fcf 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- Java 15 新特性讲解
- Java 14 新特性讲解
-- Java 13 新特性讲解
+- [Java 13 新特性讲解](https://www.wdbyte.com/java/java-13/)
- [Java 12 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk12-feature/)
- [Java 11 新特性介绍](https://www.wdbyte.com/2020/03/jdk/jdk11-feature/)
- [Java 10 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk10-feature/)
From 9e647bf88f49a993dc30aef59b83a84238db1abe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Wed, 11 Aug 2021 23:38:00 +0800
Subject: [PATCH 029/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f518fcf..a1c2957 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@
Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
- Java 15 新特性讲解
-- Java 14 新特性讲解
+- [Java 14 新特性讲解](https://www.wdbyte.com/java/java-14/)
- [Java 13 新特性讲解](https://www.wdbyte.com/java/java-13/)
- [Java 12 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk12-feature/)
- [Java 11 新特性介绍](https://www.wdbyte.com/2020/03/jdk/jdk11-feature/)
From b5939e1b66dafac72cd1ab467e0b37321f866807 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Tue, 17 Aug 2021 00:52:24 +0800
Subject: [PATCH 030/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a1c2957..ff58608 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@
Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
-- Java 15 新特性讲解
+- [Java 15 新功能介绍](https://www.wdbyte.com/java/java-15/)
- [Java 14 新特性讲解](https://www.wdbyte.com/java/java-14/)
- [Java 13 新特性讲解](https://www.wdbyte.com/java/java-13/)
- [Java 12 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk12-feature/)
From 84156771828ab56673b639db1616ba9a9819c1bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Fri, 29 Oct 2021 09:46:05 +0800
Subject: [PATCH 031/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ff58608..ccdb77e 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@
## ☕ Java 新特性
Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
-
+- [Java 16 新功能介绍](https://www.wdbyte.com/java/java-16/)
- [Java 15 新功能介绍](https://www.wdbyte.com/java/java-15/)
- [Java 14 新特性讲解](https://www.wdbyte.com/java/java-14/)
- [Java 13 新特性讲解](https://www.wdbyte.com/java/java-13/)
From 567118c97d0cfa5e62129493da8f0640790fc591 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Wed, 3 Nov 2021 13:51:20 +0800
Subject: [PATCH 032/146] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index ccdb77e..ce83a5e 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,7 @@
## ☕ Java 新特性
Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错,何况有些新特性是**真香**。
+- [Java 17 新功能介绍](https://www.wdbyte.com/java/java-17/)
- [Java 16 新功能介绍](https://www.wdbyte.com/java/java-16/)
- [Java 15 新功能介绍](https://www.wdbyte.com/java/java-15/)
- [Java 14 新特性讲解](https://www.wdbyte.com/java/java-14/)
From e89384f6c76cbb4d568d3561f73d782c5c9fe3f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Tue, 30 Nov 2021 10:14:16 +0800
Subject: [PATCH 033/146] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ce83a5e..c12cc65 100644
--- a/README.md
+++ b/README.md
@@ -121,7 +121,7 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- 锁的自动优化升级策略
## 🔍 Java 性能分析
-
+- [Java 中的监控与管理原理概述](https://www.wdbyte.com/java/monitoring.html)
- [JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!](https://www.wdbyte.com/2020/08/develop/tool-jmh/)
- [Arthas - Java 线上问题定位处理的终极利器](https://www.wdbyte.com/2019/11/arthas/)
- [超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下](https://www.wdbyte.com/2019/12/async-profiler/)
From ba544fbcb0a70610c5e6b314c4cf4471b33118f6 Mon Sep 17 00:00:00 2001
From: niumoo
Date: Sat, 4 Dec 2021 16:23:46 +0800
Subject: [PATCH 034/146] =?UTF-8?q?docs:=20=E8=AE=BE=E7=BD=AE=E9=9C=80?=
=?UTF-8?q?=E8=A6=81=E5=BF=BD=E7=95=A5=E7=9A=84=E7=9B=AE=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6aa4da5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+/target/
+*/systemlog/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/%
\ No newline at end of file
From ac3b4b3a7f914d48e499affc90f0379b4549f83c Mon Sep 17 00:00:00 2001
From: niumoo
Date: Sat, 4 Dec 2021 22:47:53 +0800
Subject: [PATCH 035/146] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20JMX=20?=
=?UTF-8?q?=E6=95=99=E7=A8=8B(https://www.wdbyte.com/java/jmx.html)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wdbyte/jmx/JavaManagementExtensions.java | 43 +++++++++++++++++++
.../main/java/com/wdbyte/jmx/MyMemory.java | 36 ++++++++++++++++
.../java/com/wdbyte/jmx/MyMemoryMBean.java | 17 ++++++++
.../com/wdbyte/jmx/MyMemoryManagement.java | 34 +++++++++++++++
4 files changed, 130 insertions(+)
create mode 100644 core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/JavaManagementExtensions.java
create mode 100644 core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemory.java
create mode 100644 core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryMBean.java
create mode 100644 core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryManagement.java
diff --git a/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/JavaManagementExtensions.java b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/JavaManagementExtensions.java
new file mode 100644
index 0000000..ec15e8b
--- /dev/null
+++ b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/JavaManagementExtensions.java
@@ -0,0 +1,43 @@
+package com.wdbyte.jmx;
+
+import java.lang.management.CompilationMXBean;
+import java.lang.management.GarbageCollectorMXBean;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryManagerMXBean;
+import java.lang.management.MemoryUsage;
+import java.lang.management.OperatingSystemMXBean;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * JMX JVM
+ *
+ * @author https://www.wdbyte.com
+ */
+public class JavaManagementExtensions {
+
+ public static void main(String[] args) {
+ OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
+ String osName = operatingSystemMXBean.getName();
+ String osVersion = operatingSystemMXBean.getVersion();
+ int processors = operatingSystemMXBean.getAvailableProcessors();
+ System.out.println(String.format("操作系统:%s,版本:%s,处理器:%d 个", osName, osVersion, processors));
+
+ CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();
+ String compilationMXBeanName = compilationMXBean.getName();
+ System.out.println("编译系统:" + compilationMXBeanName);
+
+ MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
+ MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
+ long max = heapMemoryUsage.getMax();
+ long used = heapMemoryUsage.getUsed();
+ System.out.println(String.format("使用内存:%dMB/%dMB", used / 1024 / 1024, max / 1024 / 1024));
+
+ List gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
+ String gcNames = gcMXBeans.stream()
+ .map(MemoryManagerMXBean::getName)
+ .collect(Collectors.joining(","));
+ System.out.println("垃圾收集器:" + gcNames);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemory.java b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemory.java
new file mode 100644
index 0000000..849ad25
--- /dev/null
+++ b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemory.java
@@ -0,0 +1,36 @@
+package com.wdbyte.jmx;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class MyMemory implements MyMemoryMBean {
+
+ private long total;
+ private long used;
+
+ @Override
+ public long getTotal() {
+ return total;
+ }
+
+ @Override
+ public void setTotal(long total) {
+ this.total = total;
+ }
+
+ @Override
+ public long getUsed() {
+ return used;
+ }
+
+ @Override
+ public void setUsed(long used) {
+ this.used = used;
+ }
+
+ @Override
+ public String doMemoryInfo() {
+ return String.format("使用内存: %dMB/%dMB", used, total);
+ }
+
+}
diff --git a/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryMBean.java b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryMBean.java
new file mode 100644
index 0000000..b0f3a50
--- /dev/null
+++ b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryMBean.java
@@ -0,0 +1,17 @@
+package com.wdbyte.jmx;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public interface MyMemoryMBean {
+
+ long getTotal();
+
+ void setTotal(long total);
+
+ long getUsed();
+
+ void setUsed(long used);
+
+ String doMemoryInfo();
+}
diff --git a/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryManagement.java b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryManagement.java
new file mode 100644
index 0000000..95e17e4
--- /dev/null
+++ b/core-java-modules/core-java-performance/src/main/java/com/wdbyte/jmx/MyMemoryManagement.java
@@ -0,0 +1,34 @@
+package com.wdbyte.jmx;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class MyMemoryManagement {
+
+ public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException,
+ InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
+ // 获取 MBean Server
+ MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+ MyMemory myMemory = new MyMemory();
+ myMemory.setTotal(100L);
+ myMemory.setUsed(20L);
+ // 注册
+ ObjectName objectName = new ObjectName("com.wdbyte.jmx:type=myMemory");
+ platformMBeanServer.registerMBean(myMemory, objectName);
+
+ while (true) {
+ // 防止进行退出
+ Thread.sleep(3000);
+ System.out.println(myMemory.doMemoryInfo());
+ }
+ }
+}
\ No newline at end of file
From 2eeecc0c8c83dbf084d0985805282e7fb6a66dc1 Mon Sep 17 00:00:00 2001
From: niumoo
Date: Sat, 4 Dec 2021 22:48:23 +0800
Subject: [PATCH 036/146] build: add maven core-java-modules
---
core-java-modules/pom.xml | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 core-java-modules/pom.xml
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
new file mode 100644
index 0000000..ca83800
--- /dev/null
+++ b/core-java-modules/pom.xml
@@ -0,0 +1,25 @@
+
+
+
+ parent-modules
+ com.wdbyte
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ com.wdbyte.core-java-modules
+ core-java-modules
+ core-java-modules
+ pom
+
+
+ 1.8
+ 1.8
+
+
+
+ core-java-performance
+
+
+
\ No newline at end of file
From 7e8357a6a4b852a19caa5a551fc658cbadfca5d8 Mon Sep 17 00:00:00 2001
From: niumoo
Date: Sat, 4 Dec 2021 22:49:17 +0800
Subject: [PATCH 037/146] build: add maven pom.xml
---
.../core-java-performance/pom.xml | 20 +++++++++++
pom.xml | 36 +++++++++++++++++++
2 files changed, 56 insertions(+)
create mode 100644 core-java-modules/core-java-performance/pom.xml
create mode 100644 pom.xml
diff --git a/core-java-modules/core-java-performance/pom.xml b/core-java-modules/core-java-performance/pom.xml
new file mode 100644
index 0000000..868a623
--- /dev/null
+++ b/core-java-modules/core-java-performance/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ com.wdbyte
+ core-java-performance
+ 1.0.0-SNAPSHOT
+
+
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4667231
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,36 @@
+
+
+ 4.0.0
+
+ com.wdbyte
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+ core-java-modules
+
+ parent-modules
+ Parent for all java modules
+ pom
+
+
+ 1.8
+ 31.0.1-jre
+ 3.12.0
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
From b34b8189fdf4024b44865b7589d4d34a6575919c Mon Sep 17 00:00:00 2001
From: niumoo
Date: Sat, 4 Dec 2021 22:56:58 +0800
Subject: [PATCH 038/146] docs: update readme.md
---
README.md | 1 +
core-java-modules/README.md | 6 ++++++
core-java-modules/core-java-performance/README.md | 6 ++++++
3 files changed, 13 insertions(+)
create mode 100644 core-java-modules/README.md
create mode 100644 core-java-modules/core-java-performance/README.md
diff --git a/README.md b/README.md
index c12cc65..be816ad 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,7 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
- 锁的自动优化升级策略
## 🔍 Java 性能分析
+- [使用 JMX 监控和管理 Java 程序](https://www.wdbyte.com/java/jmx.html)
- [Java 中的监控与管理原理概述](https://www.wdbyte.com/java/monitoring.html)
- [JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!](https://www.wdbyte.com/2020/08/develop/tool-jmh/)
- [Arthas - Java 线上问题定位处理的终极利器](https://www.wdbyte.com/2019/11/arthas/)
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
new file mode 100644
index 0000000..cccd8c3
--- /dev/null
+++ b/core-java-modules/README.md
@@ -0,0 +1,6 @@
+## core-java-performance
+当前模块包含 Java 核心代码
+
+### 相关文章
+- [Java 中的监控与管理原理概述](https://www.wdbyte.com/java/monitoring.html)
+- [使用 JMX 监控和管理 Java 程序](https://www.wdbyte.com/java/jmx.html)
\ No newline at end of file
diff --git a/core-java-modules/core-java-performance/README.md b/core-java-modules/core-java-performance/README.md
new file mode 100644
index 0000000..af1cddb
--- /dev/null
+++ b/core-java-modules/core-java-performance/README.md
@@ -0,0 +1,6 @@
+## core-java-performance
+当前模块包含 Java 性能分析相关代码
+
+### 相关文章
+- [Java 中的监控与管理原理概述](https://www.wdbyte.com/java/monitoring.html)
+- [使用 JMX 监控和管理 Java 程序](https://www.wdbyte.com/java/jmx.html)
\ No newline at end of file
From dc3961ba4085cb08d158563a47224ffdbd0cc95d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BF=E9=98=BF=E6=9C=97?=
Date: Sat, 4 Dec 2021 23:06:58 +0800
Subject: [PATCH 039/146] docs: update readme.md
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index be816ad..dbcf7ba 100644
--- a/README.md
+++ b/README.md
@@ -201,8 +201,6 @@ Java 版本任你发,我用 Java 8 。但是多学点这种装x技巧总没错
6. 知 乎:[https://www.zhihu.com/people/bpdwn](https://www.zhihu.com/people/bpdwn)
-7. 思 否:[https://segmentfault.com/u/niumoo](https://segmentfault.com/u/niumoo)
-
### 联系我
From ea770ea4a8dd7f91b50ff28dc592931d8eae3735 Mon Sep 17 00:00:00 2001
From: niumoo
Date: Mon, 6 Dec 2021 15:08:24 +0800
Subject: [PATCH 040/146] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20java-8=20?=
=?UTF-8?q?=E6=96=B0=E7=89=B9=E6=80=A7=E4=BB=A3=E7=A0=81(https://www.wdbyt?=
=?UTF-8?q?e.com/java-feature/)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core-java-modules/README.md | 18 +-
core-java-modules/core-java-8/README.md | 18 +
core-java-modules/core-java-8/pom.xml | 21 +
.../src/main/java/com/wdbyte/Dog.java | 59 +++
.../src/main/java/com/wdbyte/JEP371Test.java | 5 +
.../main/java/com/wdbyte/Java8BiFunction.java | 22 ++
.../com/wdbyte/Java8BiFunctionAndThen.java | 20 +
.../com/wdbyte/Java8BiFunctionAndThen2.java | 31 ++
.../com/wdbyte/Java8BiFunctionFilter.java | 68 ++++
.../main/java/com/wdbyte/Java8Consumer.java | 18 +
.../java/com/wdbyte/Java8ConsumerAndThen.java | 16 +
.../java/com/wdbyte/Java8ConsumerForEach.java | 25 ++
.../java/com/wdbyte/Java8ForEachArray.java | 15 +
.../main/java/com/wdbyte/Java8ForEachDiy.java | 25 ++
.../com/wdbyte/Java8ForEachDiyConsumer.java | 25 ++
.../com/wdbyte/Java8ForEachException.java | 30 ++
.../java/com/wdbyte/Java8ForEachList.java | 19 +
.../com/wdbyte/Java8ForEachListNormal.java | 18 +
.../main/java/com/wdbyte/Java8ForEachMap.java | 22 ++
.../com/wdbyte/Java8ForEachMapFilter.java | 25 ++
.../com/wdbyte/Java8ForEachMapNormal.java | 26 ++
.../java/com/wdbyte/Java8ForEachOrder.java | 17 +
.../main/java/com/wdbyte/Java8Function.java | 16 +
.../java/com/wdbyte/Java8FunctionAndThen.java | 16 +
.../com/wdbyte/Java8FunctionBiPredicate.java | 19 +
.../wdbyte/Java8FunctionBiPredicateOr.java | 20 +
.../Java8FunctionBiPredicateParams.java | 37 ++
.../java/com/wdbyte/Java8FunctionLength.java | 15 +
.../com/wdbyte/Java8FunctionListToMap.java | 34 ++
.../java/com/wdbyte/Java8FunctionString.java | 37 ++
.../java/com/wdbyte/Java8ObjIntConsumer.java | 29 ++
.../java/com/wdbyte/Java8PredicateAnd.java | 26 ++
.../java/com/wdbyte/Java8PredicateChain.java | 39 ++
.../java/com/wdbyte/Java8PredicateFilter.java | 18 +
.../com/wdbyte/Java8PredicateNeagete.java | 21 +
.../java/com/wdbyte/Java8PredicateObject.java | 34 ++
.../java/com/wdbyte/Java8PredicateOr.java | 23 ++
.../java/com/wdbyte/Java8PredicateTest.java | 15 +
.../main/java/com/wdbyte/Java8Supplier.java | 24 ++
.../java/com/wdbyte/Java8SupplierFactory.java | 25 ++
.../java/com/wdbyte/Java8SupplierInt.java | 17 +
.../java/com/wdbyte/Java8UnaryOperator.java | 23 ++
.../wdbyte/Java8UnaryOperatorIdentify.java | 35 ++
.../com/wdbyte/Java8UnaryOperatorParam.java | 36 ++
.../com/wdbyte/Java8UnaryOperatorParams.java | 34 ++
.../com/wdbyte/JavaBiFunctionFactory.java | 19 +
.../src/main/java/com/wdbyte/Jdk8Base64.java | 36 ++
.../main/java/com/wdbyte/Jdk8Function.java | 128 ++++++
.../main/java/com/wdbyte/Jdk8Interface.java | 82 ++++
.../src/main/java/com/wdbyte/Jdk8Lambda.java | 219 ++++++++++
.../java/com/wdbyte/Jdk8LocalDateTime.java | 177 +++++++++
.../main/java/com/wdbyte/Jdk8NashornJs.java | 38 ++
.../main/java/com/wdbyte/Jdk8Optional.java | 204 ++++++++++
.../src/main/java/com/wdbyte/Jdk8Stream.java | 374 ++++++++++++++++++
.../main/java/com/wdbyte/Jdk8StreamPro.java | 97 +++++
.../main/java/com/wdbyte/list_to_map/Dog.java | 40 ++
.../com/wdbyte/list_to_map/ListToMap.java | 26 ++
.../ListToMapConcurrentHashMap.java | 28 ++
.../com/wdbyte/list_to_map/ListToMapDog.java | 26 ++
.../list_to_map/ListToMapDuplicateKey.java | 27 ++
.../com/wdbyte/list_to_map/ListToMapSort.java | 29 ++
core-java-modules/pom.xml | 1 +
62 files changed, 2686 insertions(+), 1 deletion(-)
create mode 100644 core-java-modules/core-java-8/README.md
create mode 100644 core-java-modules/core-java-8/pom.xml
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/JEP371Test.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachList.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8StreamPro.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/Dog.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMap.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapConcurrentHashMap.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDog.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDuplicateKey.java
create mode 100644 core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapSort.java
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
index cccd8c3..f5974c1 100644
--- a/core-java-modules/README.md
+++ b/core-java-modules/README.md
@@ -1,6 +1,22 @@
-## core-java-performance
+## core-java-modules
当前模块包含 Java 核心代码
### 相关文章
+
+- [Java 8 函数接口 UnaryOperator ](https://www.wdbyte.com/java8/java8-unaryoperaotr)
+- [Java 8 函数接口 BiPredicate ](https://www.wdbyte.com/java8/java8-bipredicate)
+- [Java 8 函数接口 BiFunction ](https://www.wdbyte.com/java8/java8-bifunction/)
+- [Java 8 函数接口 Supplier ](https://www.wdbyte.com/java8/java8-supplier/)
+- [Java 8 函数接口 Predicate ](https://www.wdbyte.com/java8/java8-predicate/)
+- [Java 8 函数接口 Function ](https://www.wdbyte.com/java8/java8-function/)
+- [Java 8 新特性 - forEach 遍历](https://www.wdbyte.com/java8/java8-foreach/)
+
+- [Java 8 新特性 - LocalDate、LocalDateTime 时间处理介绍](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
+- [Java 8 新特性 - 使用 Optional优雅的处理空指针](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
+- [Java 8 新特性 - Lambda 表达式、函数接口了解一下](https://www.wdbyte.com/2019/11/jdk/jdk8-lambda/)
+- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://www.wdbyte.com/2019/11/jdk/jdk8-stream/)
+- [Java 7 新特性 - 和低效 IO 说再见,Files,Paths,Path 文件操作介绍](https://www.wdbyte.com/2020/09/jdk/jdk7-file-pahs/)
+- [Java 7 新特性 - 新特性 - 快来补一波 Java 7 语法特性](https://www.wdbyte.com/2020/01/jdk/jdk7-start/)
+
- [Java 中的监控与管理原理概述](https://www.wdbyte.com/java/monitoring.html)
- [使用 JMX 监控和管理 Java 程序](https://www.wdbyte.com/java/jmx.html)
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md
new file mode 100644
index 0000000..f9bc7b8
--- /dev/null
+++ b/core-java-modules/core-java-8/README.md
@@ -0,0 +1,18 @@
+## core-java-java
+当前模块包含 Java 8 新特性相关代码
+
+### 相关文章
+- [Java 8 函数接口 UnaryOperator ](https://www.wdbyte.com/java8/java8-unaryoperaotr)
+- [Java 8 函数接口 BiPredicate ](https://www.wdbyte.com/java8/java8-bipredicate)
+- [Java 8 函数接口 BiFunction ](https://www.wdbyte.com/java8/java8-bifunction/)
+- [Java 8 函数接口 Supplier ](https://www.wdbyte.com/java8/java8-supplier/)
+- [Java 8 函数接口 Predicate ](https://www.wdbyte.com/java8/java8-predicate/)
+- [Java 8 函数接口 Function ](https://www.wdbyte.com/java8/java8-function/)
+- [Java 8 新特性 - forEach 遍历](https://www.wdbyte.com/java8/java8-foreach/)
+
+- [Java 8 新特性 - LocalDate、LocalDateTime 时间处理介绍](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
+- [Java 8 新特性 - 使用 Optional优雅的处理空指针](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
+- [Java 8 新特性 - Lambda 表达式、函数接口了解一下](https://www.wdbyte.com/2019/11/jdk/jdk8-lambda/)
+- [Java 8 新特性 - 超强的 Stream 流操作姿势还不学习一下](https://www.wdbyte.com/2019/11/jdk/jdk8-stream/)
+- [Java 7 新特性 - 和低效 IO 说再见,Files,Paths,Path 文件操作介绍](https://www.wdbyte.com/2020/09/jdk/jdk7-file-pahs/)
+- [Java 7 新特性 - 新特性 - 快来补一波 Java 7 语法特性](https://www.wdbyte.com/2020/01/jdk/jdk7-start/)
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
new file mode 100644
index 0000000..a8cb9fc
--- /dev/null
+++ b/core-java-modules/core-java-8/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ core-java-8
+ 1.0.0-SNAPSHOT
+ core-java-8
+ jar
+
+
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
new file mode 100644
index 0000000..ca253a4
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
@@ -0,0 +1,59 @@
+package com.wdbyte;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Base64;
+
+/**
+ * @author niulang
+ * @date 2021/07/21
+ */
+public class Dog {
+
+ private String name;
+ private Integer age;
+
+ public Dog() {
+ }
+
+ public static void main(String[] args) throws IOException {
+ byte[] bytes = Files.readAllBytes(
+ Paths.get("/Users/darcy/git/java-core/java-8/target/classes/com/wdbyte/JEP371Test.class"));
+ String toString = Base64.getEncoder().encodeToString(bytes);
+ System.out.println(toString);
+ }
+
+ public Dog(String name) {
+ this.name = name;
+ }
+
+ public Dog(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return "Dog{" +
+ ", name='" + name + '\'' +
+ ", age=" + age +
+ '}';
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/JEP371Test.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JEP371Test.java
new file mode 100644
index 0000000..1329bd4
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JEP371Test.java
@@ -0,0 +1,5 @@
+package com.wdbyte;
+
+public class JEP371Test {
+ public static String lookup() {return "www.wdbyte.com";}
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
new file mode 100644
index 0000000..788f9f5
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
@@ -0,0 +1,22 @@
+package com.wdbyte;
+
+import java.util.function.BiFunction;
+
+/**
+ * @author niulang
+ * @date 2021/07/26
+ */
+public class Java8BiFunction {
+
+ public static void main(String[] args) {
+ // 两个字符串长度和
+ BiFunction lengthBiFun = (s1, s2) -> s1.length() + s2.length();
+ Integer length = lengthBiFun.apply("java", "www.byte.com");
+ System.out.println(length);
+
+ // x 的 y 次方
+ BiFunction powBiFun = (i1, i2) -> Math.pow(i1, i2);
+ Double pow = powBiFun.apply(2, 10);
+ System.out.println(pow);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
new file mode 100644
index 0000000..c01bb4d
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
@@ -0,0 +1,20 @@
+package com.wdbyte;
+
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/26
+ */
+public class Java8BiFunctionAndThen {
+
+ public static void main(String[] args) {
+ // 两个字符串长度和
+ BiFunction lengthBiFun = (s1, s2) -> s1.length() + s2.length();
+ Function function = s -> "长度和:" + s;
+
+ String result = lengthBiFun.andThen(function).apply("java", "www.byte.com");
+ System.out.println(result);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
new file mode 100644
index 0000000..68c39f2
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
@@ -0,0 +1,31 @@
+package com.wdbyte;
+
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/26
+ */
+public class Java8BiFunctionAndThen2 {
+
+ public static void main(String[] args) {
+ String result = convert("java",
+ "www.wdbyte.com",
+ (a1, a2) -> a1.length() + a2.length(),
+ r1 -> "长度和:" + r1);
+ System.out.println(result);
+
+ String convert = convert(1, 2,
+ (a1, a2) -> a1 + a2,
+ r1 -> "和是:" + r1);
+ System.out.println(convert);
+ }
+
+ public static R2 convert( T1 t1,
+ T2 t2,
+ BiFunction biFunction,
+ Function function) {
+ return biFunction.andThen(function).apply(t1, t2);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
new file mode 100644
index 0000000..83e429f
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
@@ -0,0 +1,68 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiFunction;
+
+/**
+ * @author niulang
+ * @date 2021/07/26
+ */
+public class Java8BiFunctionFilter {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+ // 筛选 2 的倍数
+ List result1 = filter(list, 2, Java8BiFunctionFilter::divisible);
+ System.out.println(result1);
+ // 筛选 3 的倍数
+ List result2 = filter(list, 3, Java8BiFunctionFilter::divisible);
+ System.out.println(result2);
+ // 筛选 4 的倍数
+ List result3 = filter(list, 4, Java8BiFunctionFilter::divisible);
+ System.out.println(result3);
+
+ // 筛选长度为 4 的字符串
+ List stringList = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
+ List stringList1 = filter(stringList, 4, (s, n) -> s.length() == 4 ? true : null);
+ System.out.println(stringList1);
+ }
+
+ /**
+ * n1 / n2 是否可以除尽
+ *
+ * @param n1
+ * @param n2
+ * @return
+ */
+ private static Boolean divisible(Integer n1, Integer n2) {
+ if (n1 % n2 == 0) {
+ return true;
+ }
+ return null;
+ }
+
+ /**
+ * 过滤集合 List 中,符合 BiFunction biFunction 的元素
+ *
+ * @param list
+ * @param u
+ * @param biFunction
+ * @param
+ * @param
+ * @param
+ * @return
+ */
+ private static List filter(List list,
+ U u,
+ BiFunction biFunction) {
+ List resultList = new ArrayList<>();
+ for (T t : list) {
+ if (biFunction.apply(t, u) != null) {
+ resultList.add(t);
+ }
+ }
+ return resultList;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
new file mode 100644
index 0000000..0402758
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
@@ -0,0 +1,18 @@
+package com.wdbyte;
+
+import java.util.function.Consumer;
+
+/**
+ * @author niulang
+ * @date 2021/07/20
+ */
+public class Java8Consumer {
+
+ public static void main(String[] args) {
+ Consumer lengthConsumer = s -> System.out.println(s.length());
+ lengthConsumer.accept("www.wdbyte.com");
+
+ Consumer printConsumer = System.out::println;
+ printConsumer.accept("www.wdbyte.com");
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
new file mode 100644
index 0000000..2055e05
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
@@ -0,0 +1,16 @@
+package com.wdbyte;
+
+import java.util.function.Consumer;
+
+/**
+ * @author niulang
+ * @date 2021/07/20
+ */
+public class Java8ConsumerAndThen {
+
+ public static void main(String[] args) {
+ Consumer lengthConsumer = s -> System.out.println(s.length());
+ Consumer printConsumer = lengthConsumer.andThen(System.out::println);
+ printConsumer.accept("www.wdbyte.com");
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
new file mode 100644
index 0000000..3dd6c7a
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
@@ -0,0 +1,25 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * @author niulang
+ * @date 2021/07/20
+ */
+public class Java8ConsumerForEach {
+
+ public static void main(String[] args) {
+ Consumer printConsumer = System.out::println;
+ List list = Arrays.asList("java", "node", "www.wdbyte.com");
+ forEach(list, printConsumer);
+ forEach(list, s -> System.out.println(s.length()));
+ }
+
+ public static void forEach(List list, Consumer consumer) {
+ for (T t : list) {
+ consumer.accept(t);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
new file mode 100644
index 0000000..70f95f1
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
@@ -0,0 +1,15 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachArray {
+ public static void main(String[] args) {
+ String[] array = {"java", "nodejs", "wdbyte.com"};
+ Arrays.stream(array).forEach(System.out::println);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
new file mode 100644
index 0000000..635654c
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
@@ -0,0 +1,25 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * @author niulang
+ * @date 2021/07/25
+ */
+public class Java8ForEachDiy {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
+ list.forEach(new Consumer() {
+ @Override
+ public void accept(String s) {
+ System.out.println(s);
+ }
+ });
+
+ list.forEach(s -> System.out.println(s));
+ list.forEach(System.out::println);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
new file mode 100644
index 0000000..4d7927e
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
@@ -0,0 +1,25 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachDiyConsumer {
+ public static void main(String[] args) {
+ Stream stream = Stream.of("java", "nodejs", "wdbyte.com");
+ List list = Arrays.asList("java", "nodejs", "wdbyte.com");
+
+ Consumer consumer = (s -> {
+ String upperCase = s.toUpperCase();
+ System.out.println(upperCase);
+ });
+
+ list.forEach(consumer);
+ stream.forEach(consumer);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
new file mode 100644
index 0000000..6fff108
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
@@ -0,0 +1,30 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachException {
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", null, "nodejs", "wdbyte.com");
+ //list.forEach(Java8ForEachException::length);
+ list.forEach(s->{
+ try {
+ System.out.println(s.length());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ public static void length(String s) {
+ try {
+ System.out.println(s.length());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachList.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachList.java
new file mode 100644
index 0000000..1a755a7
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachList.java
@@ -0,0 +1,19 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+@website https://www.wdbyte.com
+ */
+public class Java8ForEachList {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
+ // 方法引用
+ list.forEach(System.out::println);
+ System.out.println("-------------");
+ // lambda
+ list.forEach(s -> System.out.println(s));
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
new file mode 100644
index 0000000..37c2fd3
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
@@ -0,0 +1,18 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachListNormal {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "nodejs", "c++", "wdbyte.com");
+ for (String s : list) {
+ System.out.println(s);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
new file mode 100644
index 0000000..ffc95e1
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
@@ -0,0 +1,22 @@
+package com.wdbyte;
+
+import java.util.HashMap;
+import java.util.Map.Entry;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachMap {
+
+ public static void main(String[] args) {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("java", "JAVA");
+ hashMap.put("nodejs", "NODEJS");
+ hashMap.put("c++", "C++");
+ hashMap.put("wdbyte.com", "WDBYTE.COM");
+ hashMap.put(null, "OTHER");
+
+ hashMap.forEach((k, v) -> System.out.println(k + ":\t" + v));
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
new file mode 100644
index 0000000..fbc1cf1
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
@@ -0,0 +1,25 @@
+package com.wdbyte;
+
+import java.util.HashMap;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachMapFilter {
+
+ public static void main(String[] args) {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("java", "JAVA");
+ hashMap.put("nodejs", "NODEJS");
+ hashMap.put("c++", "C++");
+ hashMap.put("wdbyte", "WDBYTE.COM");
+ hashMap.put(null, "OTHER");
+
+ hashMap.forEach((k, v) -> {
+ if (k != null) {
+ System.out.println(k + ":\t" + v);
+ }
+ });
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
new file mode 100644
index 0000000..306e0bb
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
@@ -0,0 +1,26 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map.Entry;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachMapNormal {
+
+ public static void main(String[] args) {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("java", "JAVA");
+ hashMap.put("nodejs", "NODEJS");
+ hashMap.put("c++", "C++");
+ hashMap.put("wdbyte.com", "WDBYTE.COM");
+ hashMap.put(null, "OTHER");
+
+ for (Entry entry : hashMap.entrySet()) {
+ System.out.println(entry.getKey() + ":\t" + entry.getValue());
+ }
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
new file mode 100644
index 0000000..b809a5c
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
@@ -0,0 +1,17 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * @author niulang
+ * @date 2021/07/18
+ */
+public class Java8ForEachOrder {
+
+ public static void main(String[] args) {
+ Stream stream = Stream.of("java", "nodejs", "c++", "wdbyte.com");
+ stream.parallel().forEachOrdered(System.out::println);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
new file mode 100644
index 0000000..7fd4dff
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
@@ -0,0 +1,16 @@
+package com.wdbyte;
+
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @website https://www.wdbyte.com
+ * @date 2021/07/17
+ */
+public class Java8Function {
+ public static void main(String[] args) {
+ Function toUpperCase = str -> str.toUpperCase();
+ String result = toUpperCase.apply("www.wdbyte.com");
+ System.out.println(result);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
new file mode 100644
index 0000000..2ae4845
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
@@ -0,0 +1,16 @@
+package com.wdbyte;
+
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/17
+ */
+public class Java8FunctionAndThen {
+ public static void main(String[] args) {
+ Function lengthFunction = str -> str.length();
+ Function doubleFunction = length -> length * 2;
+ Integer doubleLength = lengthFunction.andThen(doubleFunction).apply("www.wdbyte.com");
+ System.out.println(doubleLength);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
new file mode 100644
index 0000000..c258741
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
@@ -0,0 +1,19 @@
+package com.wdbyte;
+
+import java.util.function.BiPredicate;
+
+/**
+ * @author niulang
+ * @date 2021/08/01
+ */
+public class Java8FunctionBiPredicate {
+
+ public static void main(String[] args) {
+ // 判断字符串的长度是否是指定长度
+ BiPredicate biFunction = (s, i) -> s.length() == i;
+ System.out.println(biFunction.test("java", 3));
+ System.out.println(biFunction.test("java", 4));
+ System.out.println(biFunction.test("www.wdbyte.com", 10));
+ System.out.println(biFunction.test("www.wdbyte.com", 14));
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
new file mode 100644
index 0000000..3bd5f9f
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
@@ -0,0 +1,20 @@
+package com.wdbyte;
+
+import java.util.function.BiPredicate;
+
+/**
+ * @author niulang
+ * @date 2021/08/01
+ */
+public class Java8FunctionBiPredicateOr {
+
+ public static void main(String[] args) {
+ BiPredicate startPredicate = (s1, s2) -> s1.startsWith(s2);
+ BiPredicate endPredicate = (s1, s2) -> s1.endsWith(s2);
+
+ boolean test = startPredicate.and(endPredicate).test("wdbyte", "w");
+ System.out.println(test);
+ boolean test1 = startPredicate.and(endPredicate).test("wsw", "w");
+ System.out.println(test1);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
new file mode 100644
index 0000000..8f94722
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
@@ -0,0 +1,37 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiPredicate;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/08/01
+ */
+public class Java8FunctionBiPredicateParams {
+
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Dog("牧羊犬", 1));
+ list.add(new Dog("牧羊犬", 2));
+ list.add(new Dog("哈士奇", 2));
+ list.add(new Dog("田园犬", 3));
+ // 筛选2岁的狗
+ BiPredicate age = (n, a) -> a == 2;
+ // 筛选牧羊犬
+ BiPredicate name = (n, a) -> "牧羊犬".equals(n);
+ // 筛选2岁的狗或者筛选牧羊犬
+ BiPredicate ageAndName = (n, a) -> "牧羊犬".equals(n) || a == 2;
+ System.out.println(filter(list, age));
+ System.out.println(filter(list, name));
+ System.out.println(filter(list, ageAndName));
+
+ }
+
+ public static List filter(List list, BiPredicate biPredicate) {
+ return list.stream()
+ .filter(dog -> biPredicate.test(dog.getName(), dog.getAge()))
+ .collect(Collectors.toList());
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
new file mode 100644
index 0000000..8b7ec4d
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
@@ -0,0 +1,15 @@
+package com.wdbyte;
+
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/17
+ */
+public class Java8FunctionLength {
+ public static void main(String[] args) {
+ Function lengthFunction = str -> str.length();
+ Integer length = lengthFunction.apply("www.wdbyte.com");
+ System.out.println(length);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
new file mode 100644
index 0000000..660de89
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
@@ -0,0 +1,34 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/17
+ */
+public class Java8FunctionListToMap {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "nodejs", "wdbyte.com");
+ // lambda 方式
+ Function lengthFunction = str -> str.length();
+ Map listToMap = listToMap(list, lengthFunction);
+ System.out.println(listToMap);
+
+ // 方法引用方式
+ Map listToMap2 = listToMap(list, String::length);
+ System.out.println(listToMap2);
+ }
+
+ public static Map listToMap(List list, Function function) {
+ HashMap hashMap = new HashMap<>();
+ for (T t : list) {
+ hashMap.put(t, function.apply(t));
+ }
+ return hashMap;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
new file mode 100644
index 0000000..02a83a2
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
@@ -0,0 +1,37 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * @author niulang
+ * @date 2021/07/17
+ */
+public class Java8FunctionString {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("Java", "Nodejs", "Wdbyte.com");
+ // 方法引用方式
+ List upperList = map(list, String::toUpperCase);
+ List lowerList = map(list, String::toLowerCase);
+ System.out.println(upperList);
+ System.out.println(lowerList);
+
+ // Lambda 方式
+ List upperList2 = map(list, x -> x.toUpperCase());
+ List lowerList2 = map(list, x -> x.toLowerCase());
+ System.out.println(upperList2);
+ System.out.println(lowerList2);
+
+ }
+
+ public static List map(List list, Function function) {
+ List resultList = new ArrayList<>(list.size());
+ for (T t : list) {
+ resultList.add(function.apply(t));
+ }
+ return resultList;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
new file mode 100644
index 0000000..28499fb
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
@@ -0,0 +1,29 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.ObjIntConsumer;
+
+/**
+ * @author niulang
+ * @date 2021/07/20
+ */
+public class Java8ObjIntConsumer {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "node", "www.wdbyte.com");
+ ObjIntConsumer consumer = (str, i) -> {
+ if (str.length() == i) {
+ System.out.println(str);
+ }
+ };
+ forEach(list, consumer, 4);
+ }
+
+ public static void forEach(List list, ObjIntConsumer consumer, int i) {
+ for (T t : list) {
+ consumer.accept(t, i);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
new file mode 100644
index 0000000..440afa6
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
@@ -0,0 +1,26 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateAnd {
+
+ public static void main(String[] args) {
+ List numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
+ numberList = numberList.stream().filter(x -> x > 5 && x < 9).collect(Collectors.toList());
+ System.out.println(numberList);
+
+ Predicate greaterThan5 = number -> number > 5;
+ Predicate lessThan9 = number -> number < 9;
+ Predicate filter = greaterThan5.and(lessThan9);
+
+ numberList = numberList.stream().filter(filter).collect(Collectors.toList());
+ System.out.println(numberList);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
new file mode 100644
index 0000000..ba7fda5
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
@@ -0,0 +1,39 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateChain {
+
+ public static void main(String[] args) {
+ List numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
+
+ Predicate lessThan5 = number -> number <= 5;
+ Predicate greaterThan9 = number -> number >= 9;
+
+ // 小于等于 5
+ System.out.println(filter(numberList, lessThan5));
+ // 大于 5
+ System.out.println(filter(numberList, lessThan5.negate()));
+ // 小于等于 5 或者大于等于 9
+ System.out.println(filter(numberList, lessThan5.or(greaterThan9)));
+ // ! (小于等于 5 AND 大于等于 9)
+ System.out.println(filter(numberList, lessThan5.and(greaterThan9).negate()));
+ }
+
+ public static List filter(List list, Predicate predicate) {
+ List resultList = new ArrayList<>();
+ for (T t : list) {
+ if (predicate.test(t)) {
+ resultList.add(t);
+ }
+ }
+ return resultList;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
new file mode 100644
index 0000000..d386c8e
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
@@ -0,0 +1,18 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateFilter {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "node", "wdbyte.com");
+ list = list.stream().filter(str -> str.length() == 4).collect(Collectors.toList());
+ System.out.println(list);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
new file mode 100644
index 0000000..3363538
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
@@ -0,0 +1,21 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateNeagete {
+
+ public static void main(String[] args) {
+ List numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
+ Predicate greaterThan5 = number -> number > 5;
+
+ numberList = numberList.stream().filter(greaterThan5.negate()).collect(Collectors.toList());
+ System.out.println(numberList);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
new file mode 100644
index 0000000..d7e10cd
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
@@ -0,0 +1,34 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateObject {
+
+ public static void main(String[] args) {
+ List dogList = new ArrayList<>();
+ dogList.add(new Dog("哈士奇", 1));
+ dogList.add(new Dog("牧羊犬", 2));
+ dogList.add(new Dog("柯基", 3));
+ dogList.add(new Dog("柴犬", 3));
+
+ // 找到 3岁的狗
+ System.out.println(filter(dogList, dog -> dog.getAge().equals(3)));
+ // 找到哈士奇信息
+ Predicate predicate = dog -> ("哈士奇").equals(dog.getName());
+ System.out.println(filter(dogList, predicate));
+ }
+
+ public static List filter(List list, Predicate predicate) {
+ List resultList = new ArrayList<>();
+ for (T t : list) {
+ if (predicate.test(t)) { resultList.add(t); }
+ }
+ return resultList;
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
new file mode 100644
index 0000000..e1e2e4a
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
@@ -0,0 +1,23 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateOr {
+
+ public static void main(String[] args) {
+ List numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
+
+ Predicate lessThan5 = number -> number <= 5;
+ Predicate greaterThan8 = number -> number >= 9;
+
+ numberList = numberList.stream().filter(lessThan5.or(greaterThan8)).collect(Collectors.toList());
+ System.out.println(numberList);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
new file mode 100644
index 0000000..5f3472f
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
@@ -0,0 +1,15 @@
+package com.wdbyte;
+
+import java.util.function.Predicate;
+
+/**
+ * @author niulang
+ * @date 2021/07/19
+ */
+public class Java8PredicateTest {
+ public static void main(String[] args) {
+ Predicate isEmpty = String::isEmpty;
+ System.out.println(isEmpty.test(""));
+ System.out.println(isEmpty.test("www.wdbyte.com"));
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
new file mode 100644
index 0000000..33c6607
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
@@ -0,0 +1,24 @@
+package com.wdbyte;
+
+import java.time.LocalDateTime;
+import java.util.Random;
+import java.util.UUID;
+import java.util.function.Supplier;
+
+/**
+ * @author niulang
+ * @date 2021/07/21
+ */
+public class Java8Supplier {
+
+ public static void main(String[] args) {
+ Supplier supplier = () -> new Random().nextInt(10);
+ System.out.println(supplier.get());
+ System.out.println(supplier.get());
+
+ Supplier supplier2 = LocalDateTime::now;
+ System.out.println(supplier2.get());
+ System.out.println(supplier2.get());
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
new file mode 100644
index 0000000..fa1d00d
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
@@ -0,0 +1,25 @@
+package com.wdbyte;
+
+import java.util.function.Supplier;
+
+/**
+ * @author niulang
+ * @date 2021/07/21
+ */
+public class Java8SupplierFactory {
+
+ public static void main(String[] args) {
+ Dog dog1 = dogFactory(() -> new Dog("哈士奇"));
+ Dog dog2 = dogFactory(() -> new Dog("牧羊犬"));
+ System.out.println(dog1);
+ System.out.println(dog2);
+ }
+
+ public static Dog dogFactory(Supplier extends Dog> supplier) {
+ Dog dog = supplier.get();
+ dog.setAge(1);
+ return dog;
+ }
+
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
new file mode 100644
index 0000000..f0a14e7
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
@@ -0,0 +1,17 @@
+package com.wdbyte;
+
+import java.util.Random;
+import java.util.function.IntSupplier;
+
+/**
+ * @author niulang
+ * @date 2021/07/23
+ */
+public class Java8SupplierInt {
+
+ public static void main(String[] args) {
+ IntSupplier intSupplier = () -> new Random().nextInt(10);
+ System.out.println(intSupplier.getAsInt());
+ System.out.println(intSupplier.getAsInt());
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
new file mode 100644
index 0000000..8711559
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
@@ -0,0 +1,23 @@
+package com.wdbyte;
+
+import java.util.Locale;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author niulang
+ * @date 2021/08/02
+ */
+public class Java8UnaryOperator {
+
+ public static void main(String[] args) {
+ Function upperFun1 = s -> s.toUpperCase();
+ UnaryOperator upperFun2 = s -> s.toUpperCase();
+
+ String res1 = upperFun1.apply("wdbyte.com");
+ String res2 = upperFun2.apply("wdbyte.com");
+
+ System.out.println(res1);
+ System.out.println(res2);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
new file mode 100644
index 0000000..ba719eb
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
@@ -0,0 +1,35 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/08/02
+ */
+public class Java8UnaryOperatorIdentify {
+
+ public static void main(String[] args) {
+ Function upperFun1 = s -> s.toUpperCase();
+ UnaryOperator upperFun2 = s -> s.toUpperCase();
+
+ List list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
+
+ Map map1 = list.stream()
+ .collect(Collectors.toMap(upperFun1::apply, Function.identity()));
+
+ Map map2 = list.stream()
+ .collect(Collectors.toMap(upperFun2::apply, UnaryOperator.identity()));
+
+ Map map3 = list.stream()
+ .collect(Collectors.toMap(upperFun2::apply, t -> t));
+
+ System.out.println(map1);
+ System.out.println(map2);
+ System.out.println(map3);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
new file mode 100644
index 0000000..f7c048b
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
@@ -0,0 +1,36 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
+
+/**
+ * @author niulang
+ * @date 2021/08/02
+ */
+public class Java8UnaryOperatorParam {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
+ UnaryOperator upperFun = s -> s.toUpperCase();
+ List resultList = map(list, upperFun);
+ System.out.println(resultList);
+
+ List intList = Arrays.asList(1, 2, 3, 4, 5);
+ UnaryOperator doubleInt = i -> i * 2;
+ List integers = map(intList, doubleInt);
+ System.out.println(integers);
+ }
+
+ public static List map(List list, UnaryOperator unaryOperator) {
+ List resultList = new ArrayList<>();
+ for (T t : list) {
+ resultList.add(unaryOperator.apply(t));
+ }
+ return resultList;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
new file mode 100644
index 0000000..dd1d3f0
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
@@ -0,0 +1,34 @@
+package com.wdbyte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author niulang
+ * @date 2021/08/02
+ */
+public class Java8UnaryOperatorParams {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
+ // 转大写
+ UnaryOperator upperFun = s -> s.toUpperCase();
+ // 截取 3 位
+ UnaryOperator subFun = s -> s.substring(0, 3);
+ List resultList = map(list, upperFun, subFun);
+ System.out.println(resultList);
+ }
+
+ public static List map(List list, UnaryOperator... unaryOperator) {
+ List resultList = new ArrayList<>();
+ for (T t : list) {
+ for (UnaryOperator operator : unaryOperator) {
+ t = operator.apply(t);
+ }
+ resultList.add(t);
+ }
+ return resultList;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
new file mode 100644
index 0000000..871dd16
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
@@ -0,0 +1,19 @@
+package com.wdbyte;
+
+import java.util.function.BiFunction;
+
+/**
+ * @author niulang
+ * @date 2021/07/26
+ */
+public class JavaBiFunctionFactory {
+
+ public static void main(String[] args) {
+ System.out.println(dogFactory("牧羊犬", 1, Dog::new));
+ System.out.println(dogFactory("哈士奇", 2, Dog::new));
+ }
+
+ public static Dog dogFactory(String name, Integer age, BiFunction biFunction) {
+ return biFunction.apply(name, age);
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
new file mode 100644
index 0000000..f3034f9
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
@@ -0,0 +1,36 @@
+package com.wdbyte;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ *
+ * JDK8 对 base64 编码的支持
+ *
+ * @Author niujinpeng
+ * @Date 2019/6/12 9:47
+ */
+public class Jdk8Base64 {
+
+ public void base64Test() {
+ String text = "1234567";
+ // 编码
+ String encoded = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
+ System.out.println(encoded);
+
+ // 解码
+ String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
+ System.out.println(decoded);
+
+ // url 编码
+ String url = "https://www.baidu.com/s?wd=jdk8";
+ String urlEncoded = Base64.getUrlEncoder().encodeToString(url.getBytes(StandardCharsets.UTF_8));
+ System.out.println(urlEncoded);
+ String urldecoded = new String(Base64.getUrlDecoder().decode(urlEncoded), StandardCharsets.UTF_8);
+ System.out.println(urldecoded);
+
+ // Result
+ // MTIzNDU2Nw==
+ // 1234567
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
new file mode 100644
index 0000000..2919164
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
@@ -0,0 +1,128 @@
+package com.wdbyte;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+
+import org.junit.Test;
+
+/**
+ *
+ * 方法引用,通过方法的名字指向一个方法
+ *
+ * - Supplier: 数据提供器,可以提供 T 类型对象;无参的构造器,提供了 get 方法
+ * - Function: 数据转换器,接收一个 T 类型的对象,返回一个 R类型的对象; 单参数单返回值的行为接口;提供了 apply, compose, andThen, identity 方法
+ * - Consumer: 数据消费器, 接收一个 T类型的对象,无返回值,通常用于设置T对象的值; 单参数无返回值的行为接口;提供了 accept, andThen 方法
+ * - Predicate: 条件测试器,接收一个 T 类型的对象,返回布尔值,通常用于传递条件函数; 单参数布尔值的条件性接口。提供了 test (条件测试) , and-or- negate(与或非) 方法。
+ *
+ * @Author niujinpeng
+ * @Date 2019/2/18 22:08
+ */
+public class Jdk8Function {
+
+ @Test
+ public void testFunction() {
+ // 构造器引用
+ final Car bmwCar = Car.create(Car::new);
+ bmwCar.setName("BMW");
+ final Car audiCar = Car.create(Car::new);
+ audiCar.setName("AUDI");
+ List cars = Arrays.asList(bmwCar, audiCar);
+ // 静态方法引用
+ cars.forEach(Car::collide);
+ // 特定类的任意对象的方法引用
+ cars.forEach(Car::repair);
+ // 特定对象的方法引用
+ cars.forEach(bmwCar::follow);
+ }
+
+ /**
+ * 函数接口
+ */
+ @Test
+ public void functionInterfaceTest() {
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python");
+ Predicate length4 = (str) -> str.length() > 4;
+ filterByForeach(skills, length4);
+ System.out.println("----------------------");
+ filterByFilter(skills, length4);
+ }
+
+ /**
+ * 接收函数参数
+ *
+ * @param list
+ * @param condition
+ */
+ public void filterByForeach(List list, Predicate condition) {
+ list.forEach(a -> {
+ if (condition.test(a)) {
+ System.out.print(a + " ");
+ }
+ });
+ }
+
+ /**
+ * 接收函数参数
+ *
+ * @param list
+ * @param condition
+ */
+ public void filterByFilter(List list, Predicate condition) {
+ list.stream().filter(a -> condition.test(a)).forEach(a -> System.out.print(a + (" ")));
+ }
+
+ /**
+ * predicate 的复杂使用
+ */
+ @Test
+ public void predicateTest() {
+ Predicate startsWith = (str) -> str.startsWith("g");
+ Predicate length = (str) -> str.length() > 4;
+
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python");
+ skills.stream().filter(startsWith.and(length)).forEach((skill) -> {
+ System.out.print(skill + " ");
+ });
+ }
+
+}
+
+class Car {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public static Car create(final Supplier supplier) {
+ return supplier.get();
+ }
+
+ public static void collide(final Car car) {
+ System.out.println("Collied:" + car.getName());
+ }
+
+ public void follow(final Car another) {
+ System.out.println("Following the:" + another.getName());
+ }
+
+ public void repair() {
+ System.out.println("Repaired:" + this.getName());
+ }
+
+}
+
+@FunctionalInterface
+interface Supplier {
+ /**
+ * 获取元素
+ *
+ * @return
+ */
+ T get();
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
new file mode 100644
index 0000000..4037c71
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
@@ -0,0 +1,82 @@
+package com.wdbyte;
+
+/**
+ *
+ * 接口的静态方法和默认方法
+ *
+ *
+ * @Author niujinpeng
+ * @Date 2019/2/18 22:52
+ */
+public class Jdk8Interface {
+ public static void main(String[] args) {
+ // 接口静态方法
+ Person.say();
+ // 接口默认方法
+ Person southerner = new Southerner();
+ southerner.eat();
+ // 接口重写方法
+ Northerners northerners = new Northerners();
+ northerners.eat();
+
+ /**
+ * result
+ * 你好啊
+ * 吃米饭
+ * 吃馒头
+ */
+ }
+}
+
+/**
+ * 南方人
+ */
+class Southerner implements Person {
+
+}
+
+/**
+ * 北方人
+ */
+class Northerners implements Person {
+ @Override
+ public void eat() {
+ System.out.println("吃馒头");
+ }
+}
+
+/**
+ * 多个接口有相同的默认方法必须重写方法
+ */
+class PersonImpl implements Person, Person2 {
+
+ @Override
+ public void eat() {
+ System.out.println("吃米饭吃粥");
+ }
+}
+
+interface Person {
+ /**
+ * 接口静态方法
+ */
+ static void say() {
+ System.out.println("你好啊");
+ }
+
+ /**
+ * 接口默认方法
+ */
+ default void eat() {
+ System.out.println("吃米饭");
+ }
+}
+
+/**
+ *
+ */
+interface Person2 {
+ default void eat() {
+ System.out.println("吃粥");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
new file mode 100644
index 0000000..46804b4
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
@@ -0,0 +1,219 @@
+package com.wdbyte;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * Lambda 的语法主要是下面几种。
+ * 1. (params) -> expression
+ * 2. (params) -> statement
+ * 3. (params) -> {statements;}
+ * Lambda 的语法特性。
+ *
+ * 1. 使用 `->` 分割 Lambda 参数和处理语句。
+ * 2. 类型可选,可以不指定参数类型,编译器可以自动判断。
+ * 3. 圆括号可选,如果只有一个参数,可以不需要圆括号,多个参数必须要圆括号。
+ * 4. 花括号可选,一个语句可以不用花括号,多个参数则花括号必须。
+ * 5. 返回值可选,如果只有一个表达式,可以自动返回不需要 return 语句,花括号中需要 return 语法。
+ *
+ * @Author niujinpeng
+ * @Date 2019/2/17 14:48
+ */
+public class Jdk8Lambda {
+
+ /**
+ * Lambda 的使用,使用 Runnable 例子
+ *
+ * @throws InterruptedException
+ */
+ @Test
+ public void createLambda() throws InterruptedException {
+ // 使用 Lambda 之前
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ System.out.println("JDK8 之前的线程创建");
+ }
+ };
+ new Thread(runnable).start();
+
+ // 使用 Lambda 之后
+ Runnable runnable1Jdk8 = () -> System.out.println("JDK8 之后的线程创建");
+ new Thread(runnable1Jdk8).start();
+
+ // 更加紧凑的方式
+ new Thread(() -> System.out.println("JDK8 之后的线程创建")).start();
+ }
+
+ /**
+ * 定义函数接口
+ */
+ @FunctionalInterface
+ public interface FunctionInterfaceDemo {
+ void say(String name, int age);
+ }
+
+ /**
+ * 函数接口,Lambda 测试
+ */
+ @Test
+ public void functionLambdaTest() {
+ FunctionInterfaceDemo demo = (name, age) -> System.out.println("我叫" + name + ",我今年" + age + "岁");
+ demo.say("金庸", 99);
+ }
+
+
+ @Getter
+ @Setter
+ @ToString
+ @AllArgsConstructor
+ static class User {
+ private String name;
+ private Integer age;
+ }
+
+ public static List userList = new ArrayList();
+
+ static {
+ userList.add(new User("A", 26));
+ userList.add(new User("B", 18));
+ userList.add(new User("C", 23));
+ userList.add(new User("D", 19));
+ }
+
+ /**
+ * 测试方法引用
+ */
+ @Test
+ public void methodRef() {
+ User[] userArr = new User[userList.size()];
+ userList.toArray(userArr);
+ // User::getAge 调用 getAge 方法
+ Arrays.sort(userArr, Comparator.comparing(User::getAge));
+ for (User user : userArr) {
+ System.out.println(user);
+ }
+ }
+
+ /**
+ * 排序输出
+ */
+ @Test
+ public void testSortBeforeJdk8() {
+ // 使用 Lambda 之前
+ userList.sort(new Comparator() {
+ @Override
+ public int compare(User u1, User u2) {
+ return u1.getAge() - u2.getAge();
+ }
+ });
+ for (User user : userList) {
+ System.out.println(user);
+ }
+ System.out.println("------------------------");
+
+ // 使用 Lambda 之后
+ // 方式1
+ userList.sort((User u1, User u2) -> u1.getAge() - u2.getAge());
+ userList.forEach(System.out::println);
+ System.out.println("------------------------");
+ // 方式2
+ userList.sort((u1, u2) -> u1.getAge().compareTo(u2.getAge()));
+ userList.forEach(System.out::println);
+ System.out.println("------------------------");
+ // 方式3
+ userList.sort(Comparator.comparing(User::getAge));
+ userList.forEach(System.out::println);
+ System.out.println("------------------------");
+ // 方式4
+ userList.stream().sorted(Comparator.comparing(User::getAge)).forEach(System.out::println);
+ }
+
+ /**
+ * 新的遍历方式
+ */
+ @Test
+ public void foreachTest() {
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python");
+ // 使用 Lambda 之前
+ for (String skill : skills) {
+ System.out.print(skill + ",");
+ }
+ System.out.println();
+
+ // 使用 Lambda 之后
+ // 方式1,forEach+lambda
+ skills.forEach((skill) -> System.out.print(skill + ","));
+ System.out.println();
+ // 方式2,forEach+方法引用
+ skills.forEach(System.out::print);
+ }
+
+ /**
+ * Lambda 对于流的操作
+ */
+ @Test
+ public void streamTest() {
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python", "java");
+ // Jdk8 之前
+ for (String skill : skills) {
+ System.out.print(skill + ",");
+ }
+ System.out.println();
+
+ // Jdk8 之后-去重遍历
+ skills.stream().distinct().forEach(skill -> System.out.print(skill + ","));
+ System.out.println();
+ // Jdk8 之后-去重遍历
+ skills.stream().distinct().forEach(System.out::print);
+ System.out.println();
+ // Jdk8 之后-去重,过滤掉 ptyhon 再遍历
+ skills.stream().distinct().filter(skill -> skill != "python").forEach(skill -> System.out.print(skill + ","));
+ System.out.println();
+
+ // Jdk8 之后转字符串
+ String skillString = String.join(",", skills);
+ System.out.println(skillString);
+ }
+
+ /**
+ * 数据转换
+ */
+ @Test
+ public void mapTest() {
+ List numList = Arrays.asList(1, 2, 3, 4, 5);
+ // 数据转换
+ numList.stream().map(num -> num * num).forEach(num -> System.out.print(num + ","));
+
+ System.out.println();
+
+ // 数据收集
+ Set numSet = numList.stream().map(num -> num * num).collect(Collectors.toSet());
+ numSet.forEach(num -> System.out.print(num + ","));
+ }
+
+ /**
+ * 数学计算测试
+ */
+ @Test
+ public void mapMathTest() {
+ List list = Arrays.asList(1, 2, 3, 4, 5);
+ IntSummaryStatistics stats = list.stream().mapToInt(x -> x).summaryStatistics();
+ System.out.println("最小值:" + stats.getMin());
+ System.out.println("最大值:" + stats.getMax());
+ System.out.println("个数:" + stats.getCount());
+ System.out.println("和:" + stats.getSum());
+ System.out.println("平均数:" + stats.getAverage());
+
+ // 求和的另一种方式
+ Integer integer = list.stream().reduce((sum, cost) -> sum + cost).get();
+ System.out.println(integer);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
new file mode 100644
index 0000000..b850e40
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
@@ -0,0 +1,177 @@
+package com.wdbyte;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
+
+import org.junit.Test;
+
+/**
+ *
+ * JDK 8 date / time api
+ *
+ * 优点:
+ *
+ * - 都是final 不可变类, 适用于多线程
+ * - 用法清晰,如都适用的now(),of(),parse(),format()方法
+ * - 实现了大部分常用操作方法
+ *
+ *
+ * @Author niujinpeng
+ * @Date 2019/2/19 17:48
+ */
+public class Jdk8LocalDateTime {
+
+ /**
+ * 时间获取
+ *
+ *
+ */
+ @Test
+ public void nowTimeTest() {
+ // 当前精确时间
+ LocalDateTime now = LocalDateTime.now();
+ System.out.println("当前精确时间:" + now);
+ System.out.println("当前精确时间:" + now.getYear() + "-" + now.getMonthValue() + "-" + now.getDayOfMonth() + " "
+ + now.getHour() + "-" + now.getMinute() + "-" + now.getSecond());
+
+ // 获取当前日期
+ LocalDate localDate = LocalDate.now();
+ System.out.println("当前日期:" + localDate);
+ System.out
+ .println("当前日期:" + localDate.getYear() + "-" + localDate.getMonthValue() + "-" + localDate.getDayOfMonth());
+
+ // 获取当天时间
+ LocalTime localTime = LocalTime.now();
+ System.out.println("当天时间:" + localTime);
+ System.out.println("当天时间:" + localTime.getHour() + ":" + localTime.getMinute() + ":" + localTime.getSecond());
+
+ // 有时区的当前精确时间
+ ZonedDateTime nowZone = LocalDateTime.now().atZone(ZoneId.systemDefault());
+ System.out.println("当前精确时间(有时区):" + nowZone);
+ System.out
+ .println("当前精确时间(有时区):" + nowZone.getYear() + "-" + nowZone.getMonthValue() + "-" + nowZone.getDayOfMonth()
+ + " " + nowZone.getHour() + "-" + nowZone.getMinute() + "-" + nowZone.getSecond());
+ }
+
+ /**
+ * 时间创建
+ */
+ @Test
+ public void createTime() {
+ LocalDateTime ofTime = LocalDateTime.of(2019, 10, 1, 8, 8, 8);
+ System.out.println("当前精确时间:" + ofTime);
+
+ LocalDate localDate = LocalDate.of(2019, 10, 01);
+ System.out.println("当前日期:" + localDate);
+
+ LocalTime localTime = LocalTime.of(12, 01, 01);
+ System.out.println("当天时间:" + localTime);
+
+ }
+
+ /**
+ * 日期转换
+ */
+ @Test
+ public void convertTimeTest() {
+ LocalDateTime parseTime = LocalDateTime.parse("2019-10-01T22:22:22.222");
+ System.out.println("字符串时间转换:" + parseTime);
+
+ LocalDate formatted = LocalDate.parse("20190101", DateTimeFormatter.BASIC_ISO_DATE);
+ System.out.println("字符串时间转换-指定格式:" + formatted);
+
+ // Date 转换成 LocalDateTime
+ Date date = new Date();
+ ZoneId zoneId = ZoneId.systemDefault();
+ System.out.println("Date 转换成 LocalDateTime:" + LocalDateTime.ofInstant(date.toInstant(), zoneId));
+
+ // LocalDateTime 转换成 Date
+ LocalDateTime localDateTime = LocalDateTime.now();
+ Date toDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ System.out.println("LocalDateTime 转换成 Date:" + toDate);
+
+ // 当前时间转时间戳
+ long epochMilli = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+ System.out.println("当前时间转时间戳:" + epochMilli);
+ // 时间戳转换成时间
+ LocalDateTime epochMilliTime =
+ LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
+ System.out.println("时间戳转换成时间:" + epochMilliTime);
+ }
+
+ /**
+ * 日期格式化
+ */
+ @Test
+ public void formatTest() {
+ LocalDateTime now = LocalDateTime.now();
+ System.out.println("当前时间:" + now);
+ System.out.println("格式化后:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
+ System.out.println("格式化后:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE));
+ System.out.println("格式化后:" + now.format(DateTimeFormatter.ISO_LOCAL_TIME));
+ System.out.println("格式化后:" + now.format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss")));
+ }
+
+ /**
+ * 时间比较
+ */
+ @Test
+ public void diffTest() {
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime yestory = now.minusDays(1);
+ System.out.println(now + "在" + yestory + "之后吗?" + now.isAfter(yestory));
+ System.out.println(now + "在" + yestory + "之前吗?" + now.isBefore(yestory));
+
+ // 时间差
+ long day = yestory.until(now, ChronoUnit.DAYS);
+ long month = yestory.until(now, ChronoUnit.MONTHS);
+ long hours = yestory.until(now, ChronoUnit.HOURS);
+ long minutes = yestory.until(now, ChronoUnit.MINUTES);
+ System.out.println("相差月份" + month);
+ System.out.println("相差天数" + day);
+ System.out.println("相差小时" + hours);
+ System.out.println("相差分钟" + minutes);
+
+ // 距离JDK 14 发布还有多少天?
+ LocalDate jdk14 = LocalDate.of(2020, 3, 17);
+ LocalDate nowDate = LocalDate.now();
+ System.out.println("距离JDK 14 发布还有:" + nowDate.until(jdk14, ChronoUnit.DAYS) + "天");
+ }
+
+ /**
+ * 日期加减
+ */
+ @Test
+ public void calcTest() {
+ LocalDateTime now = LocalDateTime.now();
+ System.out.println("当前时间:" + now);
+ LocalDateTime plusTime = now.plusMonths(1).plusDays(1).plusHours(1).plusMinutes(1).plusSeconds(1);
+ System.out.println("增加1月1天1小时1分钟1秒时间后:" + plusTime);
+ LocalDateTime minusTime = now.minusMonths(2);
+ System.out.println("减少2个月时间后:" + minusTime);
+ }
+
+ /**
+ * 时间方法
+ */
+ @Test
+ public void timeFunctionTest() {
+ LocalDateTime now = LocalDateTime.now();
+ System.out.println("当前时间:" + now);
+ // 第一天
+ LocalDateTime firstDay = now.withDayOfMonth(1);
+ System.out.println("本月第一天:" + firstDay);
+ // 当天最后一秒
+ LocalDateTime lastSecondOfDay = now.withHour(23).withMinute(59).withSecond(59);
+ System.out.println("当天最后一秒:" + lastSecondOfDay);
+ // 最后一天
+ LocalDateTime lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
+ System.out.println("本月最后一天:" + lastDay);
+ // 是否闰年
+ System.out.println("今年是否闰年:" + Year.isLeap(now.getYear()));
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
new file mode 100644
index 0000000..5389aa9
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
@@ -0,0 +1,38 @@
+package com.wdbyte;
+
+import org.junit.Test;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ *
+ * Java 8提供了新的Nashorn JavaScript引擎,使得我们可以在JVM上开发和运行JS应用。
+ *
+ * Nashorn JavaScript引擎是javax.script.ScriptEngine的另一个实现版本,
+ *
+ * 这类Script引擎遵循相同的规则,允许Java和JavaScript交互使用,例子代码如下:
+ *
+ * @Author niujinpeng
+ * @Date 2019/6/12 9:41
+ */
+public class Jdk8NashornJs {
+
+ @Test
+ public void nashornJsTest() throws ScriptException {
+ ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
+ ScriptEngine jsEngine = scriptEngineManager.getEngineByName("JavaScript");
+ System.out.println(jsEngine.getClass().getName());
+ String string = (String)jsEngine.eval("var str=\"hello\";str+\" java\"");
+ System.out.println(string);
+
+ // result
+ // jdk.nashorn.api.scripting.NashornScriptEngine
+ // hello java
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
new file mode 100644
index 0000000..ba276c2
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
@@ -0,0 +1,204 @@
+package com.wdbyte;
+
+import java.util.Optional;
+
+import org.junit.Test;
+
+import lombok.Data;
+
+/**
+ *
+ * JDK8 为解决空指针增加的 Optional 方法
+ *
+ * @Author niujinpeng
+ * @Date 2019/2/19 11:40
+ */
+public class Jdk8Optional {
+
+ /**
+ * 创建一个 Optional
+ */
+ @Test
+ public void createOptionalTest() {
+ // Optional 构造方式1 - of 传入的值不能为 null
+ Optional helloOption = Optional.of("hello");
+
+ // Optional 构造方式2 - empty 一个空 optional
+ Optional emptyOptional = Optional.empty();
+
+ // Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
+ Optional nullOptional = Optional.ofNullable(null);
+ }
+
+ /**
+ * 检查是否有值
+ */
+ @Test
+ public void checkOptionalTest() {
+ Optional helloOptional = Optional.of("Hello");
+ System.out.println(helloOptional.isPresent());
+
+ Optional emptyOptional = Optional.empty();
+ System.out.println(emptyOptional.isPresent());
+
+ // 如果有值,则获取想要的信息
+ helloOptional.ifPresent(s -> System.out.println(s.length()));
+ emptyOptional.ifPresent(s -> System.out.println(s.length()));
+ }
+
+ /**
+ * 如果有值,输出长度
+ */
+ @Test
+ public void whenIsPresentTest() {
+ Optional helloOptional = Optional.of("Hello");
+ Optional emptyOptional = Optional.empty();
+ // 如果有值,则获取想要的信息
+ helloOptional.ifPresent(s -> System.out.println(s.length()));
+ emptyOptional.ifPresent(s -> System.out.println(s.length()));
+ }
+
+ /**
+ * 如果没有值,获取默认值
+ */
+ @Test
+ public void whenIsNullGetTest() {
+ // 如果没有值,获取默认值
+ Optional emptyOptional = Optional.empty();
+ String orElse = emptyOptional.orElse("orElse default");
+ String orElseGet = emptyOptional.orElseGet(() -> "orElseGet default");
+ System.out.println(orElse);
+ System.out.println(orElseGet);
+ }
+
+ /**
+ * 如果没有值,会抛异常
+ */
+ @Test
+ public void getTest() {
+ Optional stringOptional = Optional.of("hello");
+ System.out.println(stringOptional.get());
+ // 如果没有值,会抛异常
+ Optional emptyOptional = Optional.empty();
+ System.out.println(emptyOptional.get());
+ }
+
+ /**
+ * orElse 和 orElseGet 的区别
+ */
+ @Test
+ public void orElseAndOrElseGetTest() {
+ // 如果没有值,默认值
+ Optional emptyOptional = Optional.empty();
+ System.out.println("空Optional.orElse");
+ String orElse = emptyOptional.orElse(getDefault());
+ System.out.println("空Optional.orElseGet");
+ String orElseGet = emptyOptional.orElseGet(() -> getDefault());
+ System.out.println("空Optional.orElse结果:" + orElse);
+ System.out.println("空Optional.orElseGet结果:" + orElseGet);
+ System.out.println("--------------------------------");
+ // 如果没有值,默认值
+ Optional stringOptional = Optional.of("hello");
+ System.out.println("有值Optional.orElse");
+ orElse = stringOptional.orElse(getDefault());
+ System.out.println("有值Optional.orElseGet");
+ orElseGet = stringOptional.orElseGet(() -> getDefault());
+ System.out.println("有值Optional.orElse结果:" + orElse);
+ System.out.println("有值Optional.orElseGet结果:" + orElseGet);
+ }
+
+ public String getDefault() {
+ System.out.println(" 获取默认值中..run getDeafult method");
+ return "hello";
+ }
+
+ /**
+ * 如果没有值,抛出异常
+ */
+ @Test
+ public void whenIsNullThrowExceTest() throws Exception {
+ // 如果没有值,抛出异常
+ Optional emptyOptional = Optional.empty();
+ String value = emptyOptional.orElseThrow(() -> new Exception("发现空值"));
+ System.out.println(value);
+ }
+
+ @Test
+ public void functionTest() {
+ // filter 过滤
+ Optional optional123 = Optional.of(123);
+ optional123.filter(num -> num == 123).ifPresent(num -> System.out.println(num));
+
+ Optional optional456 = Optional.of(456);
+ optional456.filter(num -> num == 123).ifPresent(num -> System.out.println(num));
+
+ // map 转换
+ Optional optional789 = Optional.of(789);
+ optional789.map(String::valueOf).map(String::length).ifPresent(length -> System.out.println(length));
+ }
+
+ /**
+ * 电脑里【有可能】有声卡
+ * 声卡【有可能】有USB接口
+ */
+ @Test
+ public void optionalTest() {
+ // 没有声卡,没有 Usb 的电脑
+ Computer computerNoUsb = new Computer();
+ computerNoUsb.setSoundCard(Optional.empty());
+ // 获取 usb 版本
+ Optional computerOptional = Optional.ofNullable(computerNoUsb);
+ String version = computerOptional.flatMap(Computer::getSoundCard).flatMap(SoundCard::getUsb)
+ .map(Usb::getVersion).orElse("UNKNOWN");
+ System.out.println(version);
+ System.out.println("-----------------");
+
+ // 如果有值,则输出
+ SoundCard soundCard = new SoundCard();
+ Usb usb = new Usb();
+ usb.setVersion("2.0");
+ soundCard.setUsb(Optional.ofNullable(usb));
+ Optional optionalSoundCard = Optional.ofNullable(soundCard);
+ optionalSoundCard.ifPresent(System.out::println);
+ // 如果有值,则输出
+ if (optionalSoundCard.isPresent()) {
+ System.out.println(optionalSoundCard.get());
+ }
+
+ // 输出没有值,则没有输出
+ Optional optionalSoundCardEmpty = Optional.ofNullable(null);
+ optionalSoundCardEmpty.ifPresent(System.out::println);
+ System.out.println("-----------------");
+
+ // 筛选 Usb2.0
+ optionalSoundCard.map(SoundCard::getUsb)
+ .filter(usb1 -> "3.0".equals(usb1.map(Usb::getVersion)
+ .orElse("UBKNOW")))
+ .ifPresent(System.out::println);
+ }
+
+}
+
+/**
+ * 计算机
+ */
+@Data
+class Computer {
+ private Optional soundCard;
+}
+
+/**
+ * 声卡
+ */
+@Data
+class SoundCard {
+ private Optional usb;
+}
+
+/**
+ * USB
+ */
+@Data
+class Usb {
+ private String version;
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
new file mode 100644
index 0000000..9a9ca9c
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
@@ -0,0 +1,374 @@
+package com.wdbyte;
+
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ *
+ * JDK 8 steam 流操作
+ *
+ * @Author niujinpeng
+ * @Date 2019/8/12 18:03
+ */
+public class Jdk8Stream {
+
+ /**
+ * 创建流的几种方式
+ * 集合
+ * Collection.stream();
+ * Collection.parallelStream()
+ * 数组
+ * Arrays.stream(T array) or Stream.of()
+ * 文件流
+ * java.io.BufferedReader.lines()
+ * 静态方法
+ * IntStream.range,IntStream.of
+ */
+ @Test
+ public void createStream() throws FileNotFoundException {
+ List nameList = Arrays.asList("Darcy", "Chris", "Linda", "Sid", "Kim", "Jack", "Poul", "Peter");
+ String[] nameArr = {"Darcy", "Chris", "Linda", "Sid", "Kim", "Jack", "Poul", "Peter"};
+ // 集合获取 Stream 流
+ Stream nameListStream = nameList.stream();
+ // 集合获取并行 Stream 流
+ Stream nameListStream2 = nameList.parallelStream();
+ // 数组获取 Stream 流
+ Stream nameArrStream = Stream.of(nameArr);
+ // 数组获取 Stream 流
+ Stream nameArrStream1 = Arrays.stream(nameArr);
+
+ // 文件流获取 Stream 流
+ BufferedReader bufferedReader = new BufferedReader(new FileReader("README.md"));
+ Stream linesStream = bufferedReader.lines();
+
+ // 从静态方法获取流操作
+ IntStream rangeStream = IntStream.range(1, 10);
+ rangeStream.limit(10).forEach(num -> System.out.print(num+","));
+ System.out.println();
+ IntStream intStream = IntStream.of(1, 2, 3, 3, 4);
+ intStream.forEach(num -> System.out.print(num+","));
+ }
+
+ @Test
+ public void streamDemo(){
+ List nameList = Arrays.asList("Darcy", "Chris", "Linda", "Sid", "Kim", "Jack", "Poul", "Peter");
+ // 1. 筛选出名字长度为4的
+ // 2. 名字前面拼接 This is
+ // 3. 遍历输出
+ nameList.stream()
+ .filter(name -> name.length() == 4)
+ .map(name -> "This is "+name)
+ .forEach(name -> System.out.println(name));
+ }
+
+ /**
+ * 转换成为大写然后收集结果,遍历输出
+ */
+ @Test
+ public void toUpperCaseDemo() {
+ List nameList = Arrays.asList("Darcy", "Chris", "Linda", "Sid", "Kim", "Jack", "Poul", "Peter");
+ List upperCaseNameList = nameList.stream()
+ .map(String::toUpperCase)
+ .collect(Collectors.toList());
+ upperCaseNameList.forEach(name -> System.out.print(name + ","));
+ }
+
+ /**
+ * 把数字值乘以2
+ */
+ @Test
+ public void mapTest() {
+ List numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ // 映射成 2倍数字
+ List collect = numberList.stream()
+ .map(number -> number * 2)
+ .collect(Collectors.toList());
+ collect.forEach(number -> System.out.print(number + ","));
+ System.out.println();
+
+ numberList.stream()
+ .map(number -> "数字 " + number + ",")
+ .forEach(number -> System.out.print(number));
+ }
+
+
+
+ /**
+ * flatmap把对象扁平化
+ */
+ @Test
+ public void flatMapTest() {
+ Stream> inputStream = Stream.of(
+ Arrays.asList(1),
+ Arrays.asList(2, 3),
+ Arrays.asList(4, 5, 6)
+ );
+ List collect = inputStream
+ .flatMap((childList) -> childList.stream())
+ .collect(Collectors.toList());
+ collect.forEach(number -> System.out.print(number + ","));
+ }
+
+ /**
+ * 遍历输出
+ */
+ @Test
+ public void forEachTest(){
+ List numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ numberList.stream().forEach(number -> System.out.print(number+","));
+ }
+
+ /**
+ * filter 数据筛选
+ * 筛选出偶数数字
+ */
+ @Test
+ public void filterTest() {
+ List numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ List collect = numberList.stream()
+ .filter(number -> number % 2 == 0)
+ .collect(Collectors.toList());
+ collect.forEach(number -> System.out.print(number + ","));
+ }
+
+ /**
+ * 查找第一个数据
+ * 返回的是一个 Optional 对象
+ */
+ @Test
+ public void findFirstTest(){
+ List numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ Optional firstNumber = numberList.stream()
+ .findFirst();
+ System.out.println(firstNumber.orElse(-1));
+ }
+
+ /**
+ * Stream 转换为其他数据结构
+ */
+ @Test
+ public void collectTest() {
+ List numberList = Arrays.asList(1, 1, 2, 2, 3, 3, 4, 4, 5);
+ // to array
+ Integer[] toArray = numberList.stream()
+ .toArray(Integer[]::new);
+ // to List
+ List integerList = numberList.stream()
+ .collect(Collectors.toList());
+ // to set
+ Set integerSet = numberList.stream()
+ .collect(Collectors.toSet());
+ System.out.println(integerSet);
+ // to string
+ String toString = numberList.stream()
+ .map(number -> String.valueOf(number))
+ .collect(Collectors.joining()).toString();
+ System.out.println(toString);
+ // to string split by ,
+ String toStringbJoin = numberList.stream()
+ .map(number -> String.valueOf(number))
+ .collect(Collectors.joining(",")).toString();
+ System.out.println(toStringbJoin);
+ }
+
+ /**
+ * 使用流操作和不使用流操作的编码风格对比
+ */
+ @Test
+ public void diffTest() {
+ // 不使用流操作
+ List names = Arrays.asList("Jack", "Jill", "Nate", "Kara", "Kim", "Jullie", "Paul", "Peter");
+ // 筛选出长度为4的名字
+ List subList = new ArrayList<>();
+ for (String name : names) {
+ if (name.length() == 4) {
+ subList.add(name);
+ }
+ }
+ // 把值用逗号分隔
+ StringBuilder sbNames = new StringBuilder();
+ for (int i = 0; i < subList.size() - 1; i++) {
+ sbNames.append(subList.get(i));
+ sbNames.append(", ");
+ }
+ // 去掉最后一个逗号
+ if (subList.size() > 1) {
+ sbNames.append(subList.get(subList.size() - 1));
+ }
+ System.out.println(sbNames);
+ System.out.println("----------------");
+
+ // 使用 Stream 流操作
+ String nameString = names.stream()
+ .filter(num -> num.length() == 4)
+ .collect(Collectors.joining(", "));
+ System.out.println(nameString);
+
+ // String string = names.stream().filter(num -> num.length() == 4).map(name -> name.toUpperCase()).collect(Collectors.joining(","));
+ String string = names.stream()
+ .filter(num -> num.length() == 4)
+ .map(name -> name.toUpperCase())
+ .collect(Collectors.joining(","));
+ }
+
+ /**
+ * reduce 字符串拼接例子
+ */
+ @Test
+ public void reduceTest() {
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python");
+ String s = skills.stream().reduce((all, skill) -> all + skill).get();
+ System.out.println(s);
+ }
+
+ /**
+ * 数据去重例子
+ */
+ @Test
+ public void distinctTest() {
+ List skills = Arrays.asList("java", "golang", "c++", "c", "python", "java");
+ List collects = skills.stream().distinct().collect(Collectors.toList());
+ collects.forEach(skill -> System.out.println(skill));
+ System.out.println("---------------------------------------------");
+ skills = Arrays.asList("java", "golang", "c++", "c", "python", "java");
+ skills.stream().distinct().forEach(s -> System.out.println(s));
+ }
+
+ /**
+ * 数学计算测试
+ */
+ @Test
+ public void mathTest() {
+ List list = Arrays.asList(1, 2, 3, 4, 5, 6);
+ IntSummaryStatistics stats = list.stream().mapToInt(x -> x).summaryStatistics();
+ System.out.println("最小值:" + stats.getMin());
+ System.out.println("最大值:" + stats.getMax());
+ System.out.println("个数:" + stats.getCount());
+ System.out.println("和:" + stats.getSum());
+ System.out.println("平均数:" + stats.getAverage());
+ }
+
+ /**
+ * 按年龄分组
+ */
+ @Test
+ public void groupByTest() {
+ List ageList = Arrays.asList(11, 22, 13, 14, 25, 26);
+ Map> ageGrouyByMap = ageList.stream()
+ .collect(Collectors.groupingBy(age -> String.valueOf(age / 10)));
+
+ ageGrouyByMap.forEach((k, v) -> {
+ System.out.println("年龄" + k + "0多岁的有:" + v);
+ });
+ }
+
+ /**
+ * 按某个条件分组
+ * 给一组年龄,分出成年人和未成年人
+ */
+ @Test
+ public void partitioningByTest() {
+ List ageList = Arrays.asList(11, 22, 13, 14, 25, 26);
+ Map> ageMap = ageList.stream()
+ .collect(Collectors.partitioningBy(age -> age > 18));
+ System.out.println("未成年人:" + ageMap.get(false));
+ System.out.println("成年人:" + ageMap.get(true));
+ }
+
+ /**
+ * 生成自己的 Stream 流
+ */
+ @Test
+ public void generateTest(){
+ // 生成自己的随机数流
+ Random random = new Random();
+ Stream generateRandom = Stream.generate(random::nextInt);
+ generateRandom.limit(5).forEach(System.out::println);
+
+ // 生成自己的 UUID 流
+ Stream generate = Stream.generate(UUID::randomUUID);
+ generate.limit(5).forEach(System.out::println);
+ }
+
+
+ /**
+ * 获取 / 扔掉前 n 个元素
+ */
+ @Test
+ public void limitOrSkipTest() {
+ // 生成自己的随机数流
+ List ageList = Arrays.asList(11, 22, 13, 14, 25, 26);
+ ageList.stream()
+ .limit(3)
+ .forEach(age -> System.out.print(age+","));
+ System.out.println();
+
+ ageList.stream()
+ .skip(3)
+ .forEach(age -> System.out.print(age+","));
+ }
+
+ /**
+ * 找出偶数
+ */
+ @Test
+ public void lazyTest() {
+ // 生成自己的随机数流
+ List numberLIst = Arrays.asList(1, 2, 3, 4, 5, 6);
+ // 找出第一个偶数
+ Stream integerStream = numberLIst.stream()
+ .filter(number -> {
+ int temp = number % 2;
+ if (temp == 0 ){
+ System.out.println(number);
+ }
+ return temp == 0;
+ });
+
+ System.out.println("分割线");
+ List collect = integerStream.collect(Collectors.toList());
+ }
+
+
+ /**
+ * 并行计算
+ */
+ @Test
+ public void main() {
+ // 生成自己的随机数流,取一千万个随机数
+ Random random = new Random();
+ Stream