JDK8-17新特性

1.Java8新特性-Lambda表达式

2.1关于Java8新特性简介

Java 8是Java编程语言的一个重大版本更新,于2014年3月发布。它引入了许多新特性和改进,使得Java编程更加方便和高效。

下面是Java 8的主要新特性:

  1. Lambda表达式:Lambda表达式是Java 8中最引人注目的特性之一。它允许开发人员使用更简洁的语法来定义匿名函数,从而使代码更简洁、可读性更强。

  2. 函数式接口:Java 8引入了函数式接口的概念,它是只包含一个抽象方法的接口。这使得开发人员可以使用Lambda表达式来实现接口的抽象方法,从而更方便地实现函数式编程。

  3. Stream API:Stream API是Java 8中一个新增的用于处理集合数据的API。它提供了一种新的编程模型,可以通过简洁的语法和方法链来操作集合数据,例如过滤、映射、排序等。

  4. 默认方法:Java 8允许在接口中定义默认方法,这是一种具有默认实现的接口方法。这使得开发人员可以在接口中添加新的方法,而不会破坏已有的实现类。

  5. 方法引用:方法引用是一种更简洁的Lambda表达式语法,它允许开发人员直接引用已有的方法,而不需要重新编写Lambda表达式。

  6. Optional类:Optional类是一个用于处理可能为空的值的容器类。它提供了一些方法来避免空指针异常,例如orElse()、isPresent()等。

  7. 新的日期和时间API:Java 8引入了全新的日期和时间API,提供了更好的日期和时间处理方式,解决了以前日期和时间处理方面的一些问题。

 2.2Lambda及其使用举例

1.Lambda表达式的使用举例:
(o1,o2) - > Integer.compare(o1,o2);


2.Lambda表达式的格式举例:
lambda形参列表  - > lambda体


3.Lambda表达式的格式
- > :lambda操作符或箭头操作符。
- >的左边:lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。
- >的右边:lambda体,对应着接口的实现类要重写的方法的方法体。


4.Lambda表达式的本质:
> 一方面,lambda表达式作为接口的实现类的对象。   --->"万事万物皆对象"

> 另一方面,lambda表达式是一个匿名函数。


5.函数式接口:
5.1 什么是函数式接口?为什么需要函数式接口?

> 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口。
> 因为只有给函数式接口提供实现类的对象时,我们才可以使用lambda表达式。

5.2 api中函数式接口所在的包

jdk8中声明的函数式接口都在java.util.function包下。

5.3 4个基本的函数式接口

函数式接口称谓参数类型用途
Consumer<T>消费型接口      T对类型为T的对象应用操作,包含方法:void accept(T t)
Supplier<T>供给型接口     无返回类型为T的对象,包含方法:T get()
Function<T,R>函数型接口      T对类型为T的对象应用操作,并返回结果,结果是R类型的对象,包含方法:R apply(T t)
Predicate<T>判断型接口      T

确定类型为T的对象是否满足某约束条件,并返回Boolean值,包含方法:

boolean test(T t)

2.方法引用和构造器引用


2.1方法引用

1.举例:

Integer :: compare

2.方法引用的理解

> 方法引用可以看作是基于lambda表达式的进一步刻画。

> 当需要提供一个函数式接口的实例时,我们可以使用lambda表达式提供实例。

    > 当满足一定的条件的情况下,还可以使用方法引用或构造器引用替换lambda表达式。

3.方法引用的本质

方法引用作为了函数接口的实例。

4.格式

类(或对象) :: 方法名

5.具体使用情况说明

情况一:对象  :: 实例方法

要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类型都相同。
此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。
注意:此方法b是非静态的方法,需要对象调用。

情况二:类 :: 静态方法

要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个静态方法b的形参列表和返回值类型都相同。
此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。
注意:此方法b是静态的方法,需要对象调用。

情况三:类 :: 实例方法

要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类型都相同。
同时,抽象方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第一个参数作为b的调用者,且方法a中的后n-1个参数与方法b的n-1个参数的类型相同。此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

2.2构造器引用

1.格式

类名 :: new

2.说明

> 调用了类名对应的类中的某一个确定的构造器。

> 具体调用的是类中的哪一个构造器呢?取决于函数式接口的抽象方法的形参列表!

3.Java8新特性:StreamAPI

3.1Stream API vs 集合框架


Stream API 关注的是多个数据的计算(排序、查找、过滤、映射、遍历等),面向CPU的。
集合关注的数据的存储,向下内存的。
Stream API 之于集合,类似于S0L之于数据表的查询。


3.2使用说明


①Stream 自己不会存储元素,
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果。
④ stream一旦执行了终止操作,就不能再调用其它中间操作或终止操作了。

3.3Stream 执行流程

步骤一:Stream实例化

实例化Stream有三种方法:

  1. 通过集合创建Stream:可以通过集合类的stream()方法获取一个Stream对象。例如:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Stream<Integer> stream = list.stream();
    
  2. 通过数组创建Stream:可以通过Arrays类的stream()方法获取一个Stream对象。例如:

    int[] array = {1, 2, 3, 4, 5};
    IntStream stream = Arrays.stream(array);
    
  3. 通过Stream的静态方法创建Stream:Stream类提供了一些静态方法用于创建Stream对象。例如:

    • Stream.of():可以接收任意数量的参数,并将其作为Stream的元素。
      Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
      
    • Stream.empty():创建一个空的Stream对象。
      Stream<Object> stream = Stream.empty();
      
    • Stream.generate():可以通过提供的Supplier函数无限生成Stream元素。
      Stream<Integer> stream = Stream.generate(() -> 1);
      
    • Stream.iterate():可以通过提供的初始值和UnaryOperator函数生成Stream。其中,初始值作为第一个元素,然后通过应用UnaryOperator函数来生成后续元素。
      Stream<Integer> stream = Stream.iterate(0, n -> n + 1);
      

步骤二:一系列的中间操作

1.筛选与切片

2.映射

3.排序

步骤三:执行终止操作

4.JDK8-17新特性 

  1. 模块化系统:JDK 9引入了模块化系统,使用Java Platform Module System(JPMS)可以将代码划分为模块,控制模块之间的依赖关系,提高了代码的可维护性和安全性。

  2. JShell:JDK 9引入了JShell,这是一个交互式的Java编程工具,可以即时执行Java代码片段进行测试和调试。

  3. 私有接口方法:JDK 9允许在接口中定义私有方法,这些方法只能在接口内部使用,方便了接口的实现和维护。

  4. Reactive Streams API:JDK 9引入了Reactive Streams API,提供了一种处理流和异步数据流的标准化方式,使得开发响应式应用程序更加容易。

  5. 集合工厂方法:JDK 9引入了一系列集合工厂方法,例如List.of()、Set.of()和Map.of(),方便创建和初始化不可变集合。

  6. 接口的私有方法和私有静态方法:JDK 9允许在接口中定义私有方法和私有静态方法,这些方法只能在接口内部使用,方便了接口的实现和扩展。

  7. 钻石操作符的支持:JDK 10引入了钻石操作符的支持,可以使用var关键字来自动推断泛型类型。

  8. 局部变量类型推断:JDK 10引入了局部变量类型推断,可以使用var关键字来自动推断局部变量的类型。

  9. Epsilon垃圾收集器:JDK 11引入了Epsilon垃圾收集器,这是一种无操作的垃圾收集器,适用于性能测试和短暂的内存压力测试。

  10. HTTP/2 客户端:JDK 11引入了原生的HTTP/2客户端支持,可以更高效地进行网络通信。

  11. 嵌套访问控制:JDK 11引入了嵌套访问控制(Nest-based Access Control),提供了更加细粒度的类访问控制机制。

  12. ZGC:JDK 11引入了Z Garbage Collector(ZGC),这是一种低延迟的垃圾回收器,适用于大内存环境下的高吞吐量应用程序。

  13. 应用程序类数据共享(Application Class-Data Sharing):JDK 14引入了应用程序类数据共享(AppCDS),可以在应用程序启动时将常用类的数据结构缓存在共享内存中,提高了应用程序的启动性能。

  14. Records:JDK 14引入了Records,这是一种简化POJO类的语法,可以自动生成常见的方法(如equals()和hashCode()),减少了代码的冗余。

  15. 并发数据结构的增强:JDK 16增强了并发数据结构,引入了一些新的接口和类,例如StampedLock和VarHandle。

4.1optional类

Optional类是Java 8中引入的一个容器类,它可以用来包装一个可能为null的值。Optional类提供了一些方法来处理包装值的情况,例如判断值是否存在、获取值、如果值存在则执行某个操作等。

Optional类的主要特点是:

  1. 可以用来包装值,可以是任意类型的值,包括基本类型和引用类型。
  2. 可以通过isPresent()方法判断包装的值是否存在。
  3. 可以通过get()方法获取包装的值,但在获取值之前应该先通过isPresent()方法判断值是否存在。
  4. 可以通过orElse(T other)方法在包装的值不存在时返回一个默认值。
  5. 可以通过ifPresent(Consumer<? super T> action)方法在包装的值存在时执行某个操作。

使用Optional类可以避免使用null引发的空指针异常。当一个方法的返回值可能为null时,可以使用Optional类来包装返回值,这样调用该方法的代码就不用再判断返回值是否为null了。

下面是一个示例代码:

Optional<String> maybeNull = Optional.ofNullable(getValue());
if (maybeNull.isPresent()) {String value = maybeNull.get();System.out.println("Value is: " + value);
} else {System.out.println("Value is null");
}// 利用ifPresent方法执行某个操作
maybeNull.ifPresent(v -> System.out.println("Value is: " + v));// 利用orElse方法给一个默认值
String value = maybeNull.orElse("default value");
System.out.println("Value is: " + value);

在上面的示例代码中,我们使用Optional类来包装一个可能为null的值。首先通过ofNullable方法将值包装成Optional对象,然后可以通过isPresent方法判断值是否存在。如果值存在,可以通过get方法获取值,或者利用ifPresent方法执行某个操作。如果值不存在,可以通过orElse方法返回一个默认值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19645.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何确保Python爬虫程序的稳定性和安全性?

在当今数字化时代&#xff0c;Python爬虫被广泛应用于数据采集和信息抓取。然而&#xff0c;确保爬虫程序的稳定性和安全性是开发过程中的重要考虑因素。本文将探讨如何通过技术手段和最佳实践来提高Python爬虫的稳定性和安全性&#xff0c;并提供代码示例。 稳定性保障 1. 异…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…

基于智能推荐的图书电商系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

JavaScript实现Promise

第一步&#xff1a;编写constructor构造方法 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#state PENDING;#result undefined;constructor(executor) {const resolve (data) > {this.#changeState(FULFILLED, data…

物理 + 人工智能 = 2024年诺贝尔物理学奖

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、机器学习与神经网络的发展前景 二、机器学习和神经网络的研究与传统物理学的关系 结…

C++:异常

1. 异常的概念 C语言主要通过错误码的方式处理错误&#xff0c;错误码本质上就是对错误信息进行分类编号&#xff0c;拿到错误码以后还要去查询错误信息&#xff0c;比较麻烦。异常时抛出一个对象&#xff0c;这个对象可以涵盖更全面的信息。 异常处理机制允许程序中独立开发的…

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的&#xff1a; 本实验通过手动输入二叉树结点信息&#xff0c;构建相应的二叉树&#xff0c;并通过图形化界面动态演示先序遍历算法的过程。通过本次实验&#xff0c;我可以深入理解二叉树的数据结构、先序遍历算法…

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 &#xff0c;文末自助获取源码 \color{red}{T624&#xff0c;文末自助获取源码} T624&#xff0c;文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境&#xff0c;在Linux下对编译链接理解&#xff0c;较为简短&#xff0c;着重在于编译的步骤。 C的环境 在ANSI C&#xff08;标准C语言&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff1a;在这个环境中&#xff0c;源代码…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

快速上手Mybatis Plus并速通MybatisPlus所有知识点

目录 一、简介 1.1 概况 1.2 特性 二、快速入门 1.建表 2.引依赖 3.application.ymal文件 4.定义mapper继承BaseMapper 5.总结 三、Mybatis Plus的使用 1.常见注解 1.1 TableName 1.2 TableId 1.3 TableField 2.常见配置 3.BaseMapper的基础CRUD方法 4.Wrapper…

使用代理解决前端跨域问题详解

目录 前言1. 什么是跨域问题&#xff1f;1.1 同源策略的定义1.2 跨域问题的表现 2. 解决跨域问题的常见方法3. 在 Vite 中配置代理解决跨域问题3.1 环境准备3.2 配置代理3.2.1 配置基础路径3.2.2 配置 Vite 代理3.2.3 参数解释 3.3 验证代理功能 4. 深入分析与注意事项4.1 代理…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

查看台式机主机支持的最大分辨率 | 显卡和显示器

通过检查显卡规格和型号&#xff0c;确认主机支持最大分辨率。 方法1&#xff1a;设置 在设置 -> 系统 -> 屏幕 及其内的高级显示设置 设置 -> 显示 方法2&#xff1a;cmd 在运行中输入“devmgmt.msc”&#xff0c;进入设备管理器界面&#xff0c;点击展开“显示适配…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时&#xff0c;根据HN Public Key把SUPI加密成SUCI&#xff0c;并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证&#xff0c;并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI&#xff0c;并保…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板&#xff0c;支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

企业数字化转型的战略指南:物联网与微服务架构的深度融合及应用解析

新时代下的企业数字化转型挑战与机遇 在当前全球经济和技术迅猛发展的背景下&#xff0c;企业数字化转型成为保持竞争力和创新的关键战略。物联网&#xff08;IoT&#xff09; 的兴起为企业提供了无数新的数据来源和运营模式&#xff0c;然而&#xff0c;如何有效整合这些数据…

vue3+vant实现弹幕循环播放~

1、效果图 <!-- 弹幕 --> <div style"height: 88px"><van-barragev-model"list"duration"5000":rows"rows":gap"gap":loop"loop"style"--move-distance: -345px" ><div class&quo…

字母异位词分组(java)

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单shilie 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "n…