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万+

手把手教你用 Docker 构建自己的 CentOS 基础镜像

目录一、准备CentOS基础镜像二、撰写Dockerfile三、构建Docker镜像四、生成Docker容器 相信码农们经常会听说:虚拟机将成为历史,Docker才是未来 !!! 事实如此,现在大部分公司都在用 Docker 技术,想拥有自己的 Docker 专属镜像,那么 Dockerfile 就是入门,现在让我们一起来看一下 ------ 构建 Docker 镜像的全过程。 好文章 记得收藏...

Nick.Peng's Blogs 1万+

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

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

qq_36937152的博客 1万+

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

shannanshouyin的博客 1276

Veeam Backup Replication Console 13 备份 PVE

本文介绍了如何通过Veeam Backup & Replication控制台配置与Proxmox VE(PVE)服务器的连接,包括主机地址、用户名密码和SSH信任设置。随后详细说明了部署备份Worker虚拟机的步骤,涵盖网络配置和VM创建。接着指导用户创建PVE虚拟机备份任务,包括命名、选择备份对象、存储位置、备份类型设置,以及配置备份计划任务。最后描述了备份测试执行过程,从启动备份到完成状态通知的完整流程。整个操作涉及服务器连接、Worker部署、备份配置和任务执行四个主要环节。

极致,细节 1602

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

Android WIFI体系:深入解析WifiLock与MulticastLock的底层实现与性能优化

本文深入解析Android WIFI体系中WifiLock与MulticastLock的底层实现机制与性能优化策略。WifiLock通过阻止Wi-Fi休眠提升网络性能,尤其WIFI_MODE_FULL_HIGH_PERF模式可显著降低延迟;MulticastLock则控制组播数据接收,但会增加功耗。文章详细探讨了其与wpa_supplicant、HAL层的交互,并提供高性能场景下的优化实践与功耗平衡方案。

php55的博客 1079

java stream filter过滤掉null值

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

hello world 8425

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

后仿真中《SDF反标必懂连载篇》之 探究 SDF延迟精度 与 timescale 精度问题

本篇文章,同样属于后仿真中的SDF反标系列文章内容之一。今天,将前仿真中的timescale 和 后仿真中 timescale+sdf 延迟数据,进行贯通讲解。不要忽视这部分内容,因为后仿真的成功准确与否,时间精度问题,很重要。为什么?接下来一一讲解。

那么菜的博客 2310

Stream流

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

qq_43677736的博客 875

使用STM32H7点亮RGB屏幕

希望本文能对你有所帮助!RGB屏幕是一种具有红、绿、蓝三种颜色通道的显示设备,通过控制每个通道的亮度,可以显示出丰富多彩的图像和动画。要使用STM32H7控制RGB屏幕,我们需要连接适当的引脚,并编写适当的代码来控制每个颜色通道的亮度。在主循环中,我们先点亮红色通道,然后延迟一段时间,接着点亮绿色通道,再延迟一段时间,最后点亮蓝色通道,并再次延迟。需要注意的是,示例代码中的延迟循环使用了一个简单的计数器实现,但实际应用中可能需要更精确的延迟方式,例如使用定时器中断或操作系统提供的延迟函数。

QoyOle的博客 923

Java8之Stream学习笔记

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

weixin_42949219的博客 419

C#与大数据分析:如何通过上位机进行设备故障诊断与预测

设备故障诊断是通过对设备的运行状态数据进行分析,识别和确认故障的类型和位置。而设备故障预测则是通过对设备的历史数据和运行状态进行分析,预测设备何时可能出现故障,从而进行预防性维护。数据采集:通过各种传感器、PLC、嵌入式设备等采集设备运行数据,如温度、压力、振动、转速、功率等。数据预处理:对采集到的数据进行清洗、去噪、缺失值处理、标准化等操作,以确保数据质量。特征工程:从原始数据中提取出有助于故障诊断和预测的特征,例如统计特征、时域特征、频域特征等。数据分析与建模。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1060

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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、付费专栏及课程。

余额充值