Java 8 学习笔记

Java8学习笔记(四) —— Stream流式编程 Java8学习笔记系列: Java8学习笔记(一)—— 函数式编程的四个基本接口 Java8学习笔记(二)—— Lambda表达式 Java8学习笔记(三)—— Optional类的使用 Java8学习笔记(四) —— Stream流式编程 Java8学习笔记(五)—— 方法引用(::双冒号操作符) 一、什么是Stream? Stream API借助Lambda表达式... 阅读详情

1. Java 8
1.1 生态

  • Lambda 表达式
  • 函数式接口
  • 方法引用 / 构造器引用
  • Stream API
  • 接口中的默认方法 / 静态方法
  • 新时间日期 API
  • 其他新特性

1.2 新特性

  • 速度更快
  • 代码更少
  • 强大的 Stream API
  • 便于并行
  • 最大化减少空指针异常 Optional (Kotlin ?)

1.3 温故而知新

  • Hashmap 底层结构/原理 老话题不再阐述 …
  • 并发hashmap …
  • Java虚拟机 …
  • Java内存模型 …

2. Lambda
2.1 匿名函数
​ Lambda是一个匿名函数,可以理解为一段可以传递的代码(将代码像数据一样传递);可以写出更简洁、更灵活的代码;作为一种更紧凑的代码风格,是Java语言表达能力得到提升。

2.2 匿名内部类

2.3 Lambda

演变过程:

基础语法

口诀:

写死小括号,拷贝右箭头,落地大括号
左右遇一括号省
左侧推断类型省
语法格式:

无参数,无返回值:() -> sout
例如 Runnable接口:

有一个参数,无返回值

有一个参数,无返回值 (小括号可以省略不写)

有两个及以上的参数,有返回值,并且 Lambda 体中有多条语句

有两个及以上的参数,有返回值,并且 Lambda 体中只有1条语句 (大括号 与 return 都可以省略不写)

Lambda 表达式 参数的数据类型可以省略不写 Jvm可以自动进行 “类型推断”
函数式接口:

接口中只有一个抽象方法的接口 @FunctionalIterface
测试:

定义一个函数式接口:

用一下:

再用一下:

2.4 案例
**案例一:**调用 Collections.sort() 方法,通过定制排序 比较两个 Employee (先按照年龄比,年龄相同按照姓名比),使用 Lambda 表达式作为参数传递

定义实体类

定义 List 传入数据

@Test

**案例二:**声明函数式接口,接口中声明抽象方法,String getValue(String str); 声明类 TestLambda,类中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值;再将一个字符串的第二个和第四个索引位置进行截取字串

**案例三:**声明一个带两个泛型的函数式接口,泛型类型为<T, R> T 为参数,R 为返回值;接口中声明对应的抽象方法;在 TestLambda 类中声明方法,使用接口作为参数,计算两个 Long 类型参数的和;在计算两个 Long 类型参数的乘积

3. 函数式接口

3.1 消费型接口

3.2 提供型接口

3.3 函数型接口

3.4 断言型接口

3.5 其他接口


4. 引用
4.1 方法引用
**定义:**若 Lambda 表达式体中的内容已有方法实现,则我们可以使用“方法引用”

语法格式:

对象 :: 实例方法
类 :: 静态方法
类 :: 实例方法
对象::实例方法

**注意:**Lambda 表达实体中调用方法的参数列表、返回类型必须和函数式接口中抽象方法保持一致

类::静态方法


类::实例方法

**条件:**Lambda 参数列表中的第一个参数是方法的调用者,第二个参数是方法的参数时,才能使用 ClassName :: Method

4.2 构造器引用
格式:

ClassName :: new

**注意:**需要调用的构造器的参数列表要与函数时接口中抽象方法的参数列表保持一致

4.3 数组引用
语法:

Type :: new;
5. Stream API
5.1 创建
什么是 Stream?


Stream的操作步骤:

创建流:(的几种方法如下)

5.2 筛选 / 切片
中间操作:

filter:接收 Lambda ,从流中排除某些元素
limit:截断流,使其元素不超过给定数量
skip(n):跳过元素,返回一个舍弃了前n个元素的流;若流中元素不足n个,则返回一个空流;与 limit(n) 互补
distinct:筛选,通过流所生成的 hashCode() 与 equals() 取除重复元素

Stream的中间操作:


内部迭代:迭代操作由 Stream API 完成
外部迭代:我们通过迭代器完成
5.3 映射
map:接收 Lambda ,将元素转换为其他形式或提取信息;接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
flatMap:接收一个函数作为参数,将流中每一个值都换成另一个流,然后把所有流重新连接成一个流
map:


flatMap:

5.4 排序
sorted():自然排序
sorted(Comparator c):定制排序
Comparable:自然排序


Comparator:定制排序


5.5 查找 / 匹配
终止操作:

  • allMatch:检查是否匹配所有元素
  • anyMatch:检查是否至少匹配一个元素
  • noneMatch:检查是否没有匹配所有元素
  • findFirst:返回第一个元素
  • findAny:返回当前流中的任意元素
  • count:返回流中元素的总个数
  • max:返回流中最大值
  • min:返回流中最小值

5.6 归约 / 收集
归约:reduce(T identity, BinaryOperator) / reduce(BinaryOperator) 可以将流中的数据反复结合起来,得到一个值
收集:collect 将流转换成其他形式;接收一个 Collector 接口的实现,用于给流中元素做汇总的方法
reduce:


collect:

5.7 案例
**案例一:**给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?(如:给定【1,2,3,4,5】,返回【1,4,9,16,25】)


**案例二:**怎样使用 map 和 reduce 数一数流中有多少个 Employee 呢?

map分组后排序

    public static Map<String, List<PsOnlineDataVo>> sortByValue(Map<String, List<PsOnlineDataVo>> map, int flag) {
        Map<String, List<PsOnlineDataVo>> sortMap = new LinkedHashMap<>();
        if (flag == 1) {
            map.entrySet().stream()
                    .sorted((o1, o2) -> Integer.valueOf(o1.getKey()).compareTo(Integer.valueOf(o2.getKey())))
                    .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue()));
        } else {
            map.entrySet().stream()
                    .sorted((o1, o2) -> Integer.valueOf(o2.getKey()).compareTo(Integer.valueOf(o1.getKey())))
                    .forEach(entry -> sortMap.put(entry.getKey(), entry.getValue()));
        }
        return sortMap;
    }

5.8 并行流

  • 并行流:就是把一个内容分成几个数据块,并用不同的线程分别处理每个数据块的流
  • Java 8 中将并行进行了优化,我们可以很容易的对数据进行操作;Stream API 可以声明性地通过 parallel() 与 sequential() 在并行流与串行流之间切换

Fork / Join 框架:

Fork / Join 框架与传统线程池的区别:


Fork / Join 实现:

Java 8 并行流 / 串行流:

@Test
public void test03(){
    //串行流(单线程):切换为并行流 parallel()
    //并行流:切换为串行流 sequential()
 
6. Optional
**定义:**Optional 类 (java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在用 Optional 可以更好的表达这个概念;并且可以避免空指针异常

常用方法:

  • Optional.of(T t):创建一个 Optional 实例
  • Optional.empty(T t):创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则空实例
  • isPresent():判断是否包含某值
  • orElse(T t):如果调用对象包含值,返回该值,否则返回 t
  • orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f):如果有值对其处理,并返回处理后的 Optional,否则返回 Optional.empty()
  • flatmap(Function mapper):与 map 相似,要求返回值必须是 Optional

Optional.of(T t):


Optional.empty(T t):


Optional.ofNullable(T t):


isPresent():


不再一一例举…

7. 接口
7.1 默认方法

类优先原则:

7.2 静态方法

8. Date / Time API
8.1 安全问题
传统的日期格式化:

加锁:

DateTimeFormatter:

String compareMonth = DateUtil.format(DateUtil.offset(DateUtil.parse(time, "yyyyMM"), DateField.YEAR, -1), "yyyyMM");
String month = DateUtil.format(DateUtil.offset(new Date(), DateField.MONTH, -1), "yyyyMM");

8.2 本地时间 / 日期
ISO 标准:

常用方法:

LocalDate / LocalTime 不再一一例举…

8.3 时间戳
Instant:以 Unix 元年 1970-01-01 00:00:00 到某个时间之间的毫秒值

@Test:

8.4 时间 / 日期 差
Duration:计算两个时间之间的间隔
Period:计算两个日期之间的间隔
@Test:

8.5 时间校正器
操纵日期:

@Test:

8.6 格式化
DateTimeFormatter:格式化时间 / 日期

8.7 时区
ZonedDate
ZonedTime
ZonedDateTime
@Test:

一些转换:

9. 注解
9.1 重复注解
定义注解:

定义容器:

@Test:

9.2 类型注解
Java 8 新增注解:新增ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上)
 

Java8学习笔记(二)—— Lambda表达式 Java8学习笔记系列: Java8学习笔记(一)—— 函数式编程的四个基本接口 Java8学习笔记(二)—— Lambda表达式 Java8学习笔记(三)—— Optional类的使用 Java8学习笔记(四) —— Stream流式编程 Java8学习笔记(五)—— 方法引用(::双冒号操作符) 一、什么是Lambda表达式 Lambda是Java8的一个语法糖,... 阅读详情

相关推荐

Java8学习笔记(一)—— 函数式编程的四个基本接口

Java8学习笔记系列: Java8学习笔记(一)—— 函数式编程的四个基本接口 Java8学习笔记(二)—— Lambda表达式 Java8学习笔记(三)—— Optional类的使用 Java8学习笔记(四) —— Stream流式编程 Java8学习笔记(五)—— 方法引用(::双冒号操作符) 一、基本函式数接口 基本的函数式接口主要有四个: ① Supplier<T&...

云卷云舒的架构师之路 1751

Java8之流(Stream)操作与可空类(Optional)

​Java8的集合支持新的stream方法会返回流(java.util.stream.Stream),流只能遍历一次;其可以支持常用的类似数据库的流操作。中间操作可以连接起来(将一个流转换为另一个流)构建一个流水线,终端操作会消耗流,以产生一个最终结果: 中间操作(返回Stream) filter(Predicate<?>):返回匹配的流; map(Fu...

飞鹰技术 1万+

硬件原理图分析

文章目录1 硬件原理图分析1.1 MCU部分1.2 NB部分1.3 电源部分 1 硬件原理图分析 1.1 MCU部分 MCU接口部分没啥需要注意,都是常规操作。 1.2 NB部分 U4是用来防静电的。 由于NB的以上几个引脚只支持1.8V,所以这里需要3.3V转1.8V的电路。只要把握住谁改变电平就好分析是怎么实现电平转换的了。 1.3 电源部分 图中的MOS是用来实现USB和电池同时插入时只能USB供电功能的。 ...

木子皿--啥都不会的菜鸟 8169

Java-JDK8的stream()list转map当map的value值为空的处理和空字段为空的排序处理

JDK8的stream()list转map当map的value值为空的处理和空字段为空的排序处理

qq_36937152的博客 1万+

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4454

无刷电机控制基础(2)——有感和无感驱动、调速

上一篇文章我们讲了一些无刷电机的基础知识,包括无刷电机的内部结构,驱动原理等,我们知道了只需要按照转子的当前位置,来按顺序给定子线圈通电,就能让电机转动起来。但是,上一篇中我们跳过了一个关键步骤,就是如何检测转子的位置。本篇我们就讲讲常用的位置检测方法,以及引出的一些相关问题。我们知道,获取磁铁的位置可以用霍尔传感器,无刷电机的转子就是永磁体,因此只要在合适的位置安装霍尔传感器,就能知道转子的旋转位置。在无刷电机中,一般用3个开关型霍尔器件就能检测转子的位置。

小白白学电子 2万+

java8特性之forEach篇

java8特性之forEach篇forEach介绍使用条件迭代原理性能 forEach介绍 forEach是java8的特性之一,它可以大大简化代码的操作,比如有关HashMap的操作: HashMap<Integer, String> hashMap = new HashMap<>(3); hashMap.put(1, "张三"); hashMap.put(2, "李四"...

qq_16410733的博客 5576

我从华为身上学到的项目管理经验 -- 需求篇

记录这三年,关于项目管理上的一些心得体会 – 需求篇对于需求,我们可以根据不同的角色、理解拆分成三个过程:简单来说就是:需求分析原始需求、 需求拆分为系统需求、 需求实现为功能需求**需求分析**: 将客户需求 输出成 需求描述。 需求经理需要把 需求 转换成 客户能够接受的 初始需求 IR(Initial Requirement) 对于用户来说,我只管提 我的原始需求是

minminzhe520的博客 3万+

java stream filter过滤掉null值

代码 List<Long> filterList = testList.stream().filter(temp -> temp != null && temp.xxx != null). collect(Collectors.toList());

hello world 8425

[Dify实战] 用 Dify 打造高效的新员工 7 天成长计划-带绑定资源

本文介绍了如何利用Dify平台为新员工制定智能成长计划,解决融入难、节奏乱、成长慢等问题。方案通过输入岗位信息自动生成7天结构化计划,包含每日任务和评估要点,并支持进度跟踪与报告输出。关键点在于设计清晰的Prompt模板,合理分配学习节奏,形成闭环反馈机制。该方案能显著提升新员工培养效率,实现人才培养的数字化升级。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 569

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

算法大师! 665

Stream流

Stream流 Stream(流)是一个来自数据源的元素队列并支持聚合操作: 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而 是按需计算。 数据源 流的来源。 可以是集合,数组等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted 等。 1. Stream流操作的三个步骤: 创建Stream 一个数据源(如:集合、数组),获取一个流 中间操作 一个中间操作链,对数据源的数据进行处理 终

qq_43677736的博客 875

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 350

Java8之Stream学习笔记

以下是一个包含多个Stream操作的示例程序,它涵盖了常用操作,主要针对List的操作,Lis中为对象。

weixin_42949219的博客 419

【Visual Assist X助手安装问题】Visual Assist X无法安装(双击安装包没反应) | Visual Assist X安装后在Visual Studio中找不到(亲测有效)

本文分享了Visual Assisant X助手的安装与使用问题的详细解决办法,因为网上搜集的信息比较少,所以有一定的参考价值。考虑到很多开发新手会遇到上述问题,可能对Windows系统不熟悉,所以相关操作步骤讲解的很详细!

dvlinker的技术专栏 6万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java JDK8 学习笔记——助教学习博客汇总

java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Java学习笔记第四章——认识对象Java学习笔记第五章——对象封装Java学习笔记第六章——继承与多态 7-10、12、14章 (by吴子怡) Java学习笔记JDK8》学习总结 11、...

weixin_30607029的博客 437

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java jdk 8学习笔记,Java JDK 8学习笔记 PDF_源雷技术空间

资源名称:Java JDK 8学习笔记 PDF内容简介:●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念、操作、应用等问题及解决方案●针对Java SE 8新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新●详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对照关系●从Java SE API的源代码分析,了解各种语法在Java...

weixin_42132354的博客 375

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java8学习笔记(三)—— Optional类的使用

Java8学习笔记系列: Java8学习笔记(一)—— 函数式编程的四个基本接口 Java8学习笔记(二)—— Lambda表达式 Java8学习笔记(三)—— Optional类的使用 Java8学习笔记(四) —— Stream流式编程 Java8学习笔记(五)—— 方法引用(::双冒号操作符) 一、Optional类的作用 Optional类的作用主要是为了解决...

云卷云舒的架构师之路 2281

java8学习笔记-Stream流Collector收集器

fun2为下游收集器,可以将列表转换成其他形式,例如toSet()、counting()、summingInt/Long/Double(fun)、maxBy(Comparator)、minBy(Comparator)、mapping(fun1, fun2)(fun1为转换函数,fun2为下游收集器)两个fun用来产生键和值,若值为元素本身,则fun2为Function.identity()fun是分类函数,生成Map,键是fun函数结果,值是具有相同fun函数结果元素的列表。

nimqbiyq的博客 947

JAVA8 Stack学习笔记

栈-Stack 定义:栈的元素是按后进先出(LIFO)的方法进行处理的,最后入栈的元素最先出栈;栈是一种线性集合,其添加和删除都在一端进行;Stack类继承了Vector类 public class Stack&amp;amp;lt;E&amp;amp;gt; extends Vector&amp;amp;lt;E&amp;amp;gt; { public Stack() { } public E push(E item) {} public sync...

luoyoub的博客 778

45天啃透这本阿里P8架构师整理的Java核心学习笔记,连收7个Offer

一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。而我比较幸运,有幸获得了来自阿里P8架构师分享的Java核心学习笔记,花了一个半月的时间学习,之后面试信心满满,陆续拿到了京东,美团,阿里等大厂的七个Offer。在此把笔记分享出来,希望能帮到更多爱学习的人,也助更多的人能在面试当中顺利拿到Offer,进自己所钟意的大厂,做更好的自己。某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我。

jcc4261的博客 952

关于Java8中的新特性—流式编程的学习笔记代码

关于Java8中的新特性—流式编程的学习笔记代码 ​ 每次看我一位同学(xx苛)的代码,总是让人感觉舒服高级,自己却怎么也写不出那种感觉,对他的崇拜之情自然不言而喻。所以呢,在询问下,他向我推荐了java8新特性中的流式编程,一直想学,正巧今日时间充足,因此从网上找到了两篇我认为非常棒的博客来进行学习,其中我本人也将其中的代码全部写了一遍,思路也从极乱到豁然开朗,所以特拿来分享(博客链接及代码)。...

qq_42956790的博客 409

《Thinking in java》-学习笔记(8)

第8章 对象的容纳 1.数组 考虑到执行效率和类型检查,尽可能地采用数组。 2.集合 四种类型:Vector(矢量)、bitset(位集)、Stack(堆栈)、Hashtable(散列表)。 Hashtable是一种关联数组,允许我们将对象关联起来,集合类会自动改变自身的大小。 缺点是:将对象置入一个集合时丢失了类型信息,在使用的时候必须进行造型。 3.枚举器(反复器) 可以利用集...

DeepingC 1459

Java学习笔记(第8版)教材解析与开发环境搭建指南

Java作为面向对象编程语言的核心技术,其学习路径与开发环境配置直接影响学习效率。从JDK安装、IDE配置到代码调试,正确的环境搭建能避免常见路径错误和版本冲突问题。以《Java学习笔记(第8版)》为例,该书采用问题导向的教学方法,特别适合解决自学过程中的典型困惑,如面向对象设计中的toString()方法应用等。结合Java 17新特性如密封类(sealed class)的解读,以及HashMap实现原理等面试高频知识点,为Java初学者和进阶者提供了从基础语法到并发编程的系统学习方案。通过合理配置Int

weixin_29213827的博客 238
上一篇: 定位及优化SQL语句的性能问题
下一篇: 创建高性能的索引
dream_alen
博客等级 码龄11年 6粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值