Java8新特性

1.Lambda表达式

>语法

左侧: 指定了Lambda表达式需要的参数列表

右侧: 制定了Lambda体,是抽象方法的实现逻辑,即Lambda表达式要执行的功能

>语法格式

1)无参,无返回值

2)需要一个参数,但没有返回值

3)数据类型可以省略

4)Lambda若只需要传入一个参数时,参数的小括号可以省略

5)Lambda若需要传入两个或以上的参数,多条执行语句,并且可以有返回值

6)但Lambda体只有一条语句时,return与大括号若有,都可以省略

2.函数式接口

>什么是函数式接口?

• 只包含一个抽象方法(Single Abstract Method,简称 SAM)的接口,称为函数式接
口。当然该接口可以包含其他非抽象方法。
• 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受
检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。

我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是
否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数
式接口。
• 在 java.util.function 包下定义了 Java 8 的丰富的函数式接口

>如何理解函数式接口?

• 面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。
• 函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重
视过程。
• 在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的编程语
言中,Lambda 表达式的类型是函数。但是在 Java8 中,有所不同。在 Java8 中,
Lambda 表达式是对象,而不是函数,它们必须依附于一类特别的对象类型------函数
式接口。
• 简单的说,在 Java8 中,Lambda 表达式就是一个函数式接口的实例。这就是 Lambda
表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该
对象就可以用 Lambda 表达式来表示。

>举例

>四大核心函数式接口

1)消费型接口 Consumer<T> 对类型为T的对象应用操作,包含方法: void accept(T t)

消费型接口的特点: 有形参,但是返回值类型是void

2)供给型接口 Supplier<T> 返回类型为T的对象,包含方法: T get()

供给型接口的特点; 无参,但是有返回值

3)函数型接口 Function<T,R> 对类型为T的对象应用操作,并返回结果,结果类型时R类型的对象,包含方法: R apply(T t)

函数型接口的特点: 既有参数又有返回值

4)判断型接口 Predicate<T> 确定类型为T的对象是否满足约束,并返回boolean值,包含方法: boolean test(T t)

判断型接口的特点: 有参,但是返回值类型是boolean型

3.Stream API

>说明

• Stream API ( java.util.stream) 把真正的函数式编程风格引入到 Java 中。这是目前为止
对 Java 类库 最好的补充 ,因为 Stream API 可以极大提供 Java 程序员的生产力,让程
序员写出高效率、干净、简洁的代码。
• Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操
作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用 Stream API 对集合
数据进行操作,就类似于使用 SQL 执行的数据库查询。 也可以使用 Stream API 来
并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

>Stream操作的三个步骤

1)创建Stream

一个数据源(如集合,数组),获取一个流

2)中间操作

每次处理都会返回一个持有结果的新Stream,即中间操作的方法返回值仍然是Stream类型的对象,因此中间操作可以是一个操作链,可以对数据源的数据进行n次处理,但是在终止操作前,并不会真正执行

3)终止操作

终止操作的方法返回值就不再是Stream了,因此一旦执行终止操作,就结束真个Stream操作了,一旦执行终止操作,就执行中间操作链,最终产生结果并结束Stream

>一系列中间操作

相关推荐
二哈赛车手4 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物5 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~5 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李5 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8295 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁6 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git