JDK8新特性之Optional快速入门

JDK 8 到 JDK 24 新特性大全 Java Development Kit (JDK) 是 Sun 公司(已被 Oracle 收购)针对 Java 开发员的软件开发工具包。自从 Java 推出以来,JDK 已经成为使用最广泛的 Java SDK(Software development kit)。 阅读详情

作为程序猿一定会遇到NullPointerException异常,简称NPE,随之而来的就是为空判断if else。逻辑稍微复杂点,代码就显得不好看了。比如:

public String getCity(User user) throws Exception {
    if (user != null) {
        if (user.getAddress() != null) {
            Address address = user.getAddress();
            if (address.getCity() != null) {
                return address.getCity();
            }
        }
    }
    throw new Excpetion("取值错误");
}

换成JDK8的Optional的写法:

public String getCity(User user) throws Exception {
    return Optional.ofNullable(user)
            .map(u -> u.getAddress())
            .map(a -> a.getCity())
            .orElseThrow(() -> new Exception("取指错误"));
}

代码就会简洁很多。接下来我们一起快速认识一下Optional。


1、创建Optional对象

Optional的本质,就是内部储存了一个真实的value值,在构造的时候,就直接判断其值是否为空。

  • Optional(T value) 私有构造方法,用于创建值为null的Optional对象。
  • empty() public方法,用于创建值为null的Optional对象。
  • of(T value) public方法,用于创建值为value的Optional对象,value不能为空,value为空时代码运行会报错。
  • ofNullable(T value) public方法,用于创建值为value的Optional对象,value可以为空,如果为空则等同于empty()。

用法示例:

@Test
public void test(){
	Optional<User> op = Optional.of(new User());
	Useremp = op.get();
	System.out.println(emp); //正常输出

	Optional<User> op2 = Optional.empty();
	System.out.println(op2.get()); //java.util.NoSuchElementException: No value present

	Optional<User> op3 = Optional.ofNullable(null);
	System.out.println(op3.get()); //java.util.NoSuchElementException: No value present

	Optional<User> op4 = Optional.ofNullable(new User("张三",18));
	System.out.println(op4.get()); //正常输出
}

2、值为空时Optional提供的else操作

上面示例可以看到,如果value值为空时,调用op.get()方法会报错。此时我们可以提供else操作。

  • orElse(T other) 如果T为常量值,可以使用。
  • orElseGet(Supplier<? extends T> other) 如果Supplier是创建对象或复杂逻辑操作时,可以使用,因为value值为空时才会调用Supplier。
  • orElseThrow(Supplier<? extends X> exceptionSupplier) 如果value值为空时想抛出异常,可以使用。

代码示例:

@Test
public void test() {
    User user = null;
    user = Optional.ofNullable(user).orElse(createUser());
    user = Optional.ofNullable(user).orElseGet(() -> createUser());

    user = null;
    Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));
}

public User createUser(){
    User user = new User();
    user.setName("zhangsan");
    return user;
}

3、map()转换的操作

  • map(Function<? super T, ? extends U> mapper) 常用,值转换后在内部封装了一个新的Optional对象。
  • flatMap(Function<? super T, Optional> mapper) 日常用的少,等同于map(),区别是值转换后留给用户封装新的Optional对象。

代码示例:

@Test
public void test(){
	User user = new User("张三", 18);

	String userName = Optional.ofNullable(user).map(u-> u.getName()).get();
	
	Optional<String> op = Optional.ofNullable(user).flatMap((e) -> Optional.ofNullable(e.getName()));
	userName = op.get();
}

4、isPresent()和ifPresent()判断值是否为空

  • isPresent() 判断Optional里的value是否为空
  • ifPresent(Consumer<? super T> consumer) 判断Optional里的value值为空为,则执行Consumer

代码示例:

@Test
public void test(){
	Optional<User> op = Optional.ofNullable(("张三", 18));
	
	if (op.isPresent()){
	   // TODO: do something
	}

	op.ifPresent(u->{
	    // TODO: do something
	});
}

5、filter()过滤值

filter(Predicate<? super T> predicate),如果满足过滤条件,那么返回这个 Optional;否则返回 Optional.empty。

代码示例1:

Optional<User> op = Optional.ofNullable(user).filter(u -> u.getAge()>30);

代码示例2:

// 传统写法
public User getUser(User user) throws Exception{
    if(user!=null){
        if("张三".equals(user.getName())){
            return user;
        }
    }else{
        user = new User("张三", 18)
        return user;
    }
}

// JDK8 Optional的写法
public User getUser(User user) {
	return Optional.ofNullable(user)
			.filter(e -> "张三".equals(e.getName()))
			.orElseGet(() -> new User("张三", 18));
}

参考《Java 判空新写法!干掉 if else !》

本篇结束。


全面讲解Java JDK8新特性与代码实践 Lambda表达式是一种简洁的代码写法,用于表示仅包含单个方法的接口的实例。在Java中,它们经常用于简化事件监听器和其他回调的代码。例如,之前需要一个类来实现一个接口,实现它的方法,然后实例化这个类。现在可以用Lambda表达式来快速实现相同的功能。// 传统的匿名内部类实现@Override");}).start();// Lambda表达式实现函数式编程关注点在于函数的使用,包括函数的一等公民地位(函数可以作为参数传递、返回值、变量赋值),以及无副作用的特性。 阅读详情

相关推荐

GPT大模型在数学建模中的实战应用:从思路启发到代码生成

数学建模是将现实问题抽象为数学问题并求解的核心方法,其关键在于通过合理的假设与简化,构建可计算的数学模型。传统建模依赖MATLAB等工具进行推演试错,而大语言模型的出现革新了这一范式。GPT等模型通过理解自然语言、辅助逻辑推理与代码生成,能有效提升建模效率与质量,在问题解析、模型构建、算法实现等环节提供关键支持。本文聚焦GPT在数学建模中的具体应用,涵盖赛题解读、模型推导、代码生成与结果分析,并结合实战案例,探讨如何将其作为“副驾驶”融入建模全流程,实现人机协同的智能化建模。

weixin_29061465的博客 324

jdk8新特性-Optional

jdk8-Optional使用

xiao_yu_gan的博客 2466

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

JDK8新特性(四):Optional 类的使用

Optional类的使用 JDK8以前,编写代码,通常会出现 NullPointerException (空指针异常),通常情况下我们都是通过 if ... else... 来对对象进行为空判断,然后再进行逻辑处理,代码写起来也比较冗余。 JDK8新增了Optional类,使用该类可以避免我们对空指针的检查,使代码看起来比较优雅。 1.Optional类介绍 ...

扛麻袋的少年的博客 6953

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 230

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4428

详解 JDK8 新特性之 Optional 类

详解 JDK8 新特性之 Optional 类

h2806504347的博客 565

UE4 Instanced Mesh 半透明渲染顺序不对解决

以绿色方块为Instanced Mesh为例。 正确的半透应该是这样的: 这是一般蓝图Actor方块,其半透是正常的。 然而Instanced Mesh因为过多,UE4不给你缓存正确的渲染顺序。所以,在不改代码的情况下,想解决Instanced Mesh半透问题,是不可能的。不正确的半透如下: 注意到错误发生在Instanced Mesh的方块与方块之间。 但我就是要解决,...

qq_41524721的博客 5569

Java新特性:Optional类

Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。 Java 8 引入 Optional 类,用来解决 NullPointerException。 Optional 代替 if…else 解决空指针问题,使代码更加简洁。

栗筝i的博客 9143

一步一步搭建S32K14x的AutoSar项目----MCAL工程创建及说明

一步一步搭建S32K14X的Autosar项目--MCAL工程创建及说明

wo580231的博客 2494

博途PLC如何建立与笔记本电脑端的连接?(新手必会)

对S7-1500PLC下载硬件组态或程序,需要建立PC与PLC的连接。 由于S7-1500CPU都具有PN端口,因此建立PC与S7-1500PLC的连接通常使用工业以太网来实现。 1.使用网线连接PC-PLC 使用网线,一端连接PC的以太网卡端口,另一端连接S7-1500CPU的PN端口。 2.设置本机IP地址 2.1 确认本机要设置的IP地址段 本机IP地址要和PLC程序组态IP地址段前三位保持一致,后一位使用组态中没有用到的IP地址段。如下图所示。 那么看了这个图片应该就知道了,地址应该设置成192.

weixin_42430971的博客 1万+

JDK8新特性(一):Optional类

JDK8新增了Optional 类,它是一个没有子类的工具类。我们可以把它看作是一个容器。这个容器有两种情况:①要么有值 ②要么为null。

weixin_54009596的博客 668

1-Wire 单总线硬件结构及软件时序分析(实测波形+C代码分析)

1根线就可以通信,是不是很神奇?因为其节省I/O口的优点而被广泛使用!

记得诚 1万+

JDK1.8入门指南:从安装到第一个Lambda程序

最近在帮朋友入门Java开发,发现JDK1.8作为长期支持版本,仍然是很多企业的首选。今天整理了一份新手友好的学习路线,从最基础的环境搭建到1.8的核心特性Lambda表达式,希望能帮助到同样刚开始接触Java的朋友们。这是所有Java程序的起点,理解public static void main(String[] args)的结构意义。不需要配置任何环境,打开网页就能写Java代码,还能实时看到运行结果。从匿名内部类改造开始,比如用Lambda简化Runnable实现,逐步过渡到更复杂的用法。

StarfallRaven13的博客 1038

Devexpress16.2.6破解工具

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JDK8-17新特性

JDK8-17新特性

weixin_44525733的博客 1372

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JDK1.8的新特性(详细总结)

目录 前言 一、jdk8简介 二、Lambda表达式语法 函数式接口 三、jdk8 内置四大核心函数接口 消费型接口(海王式接口,只知道索取) 供给型接口(舔狗式接口,只知道付出,不索取回报的) 函数型接口(双向奔赴,有输入有输出) 断言型接口 四、关于jdk8的对象引用问题 构造引用 数组引用 五、StreamAPI Stream的操作三个步骤 5.1 Stream流的五种实例化方式 5.2 Stream流处理的filter过滤操作和distinct操作 5....

qq_52445443的博客 2574

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JDK1.8的新特性2

代表一个存在或不存在的值,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。​ 如果一个接口中定义了一个默认方法,而接口实现类的父类定义了一个同名的方法时,选择父类中的方法。默认方法:从JDK1.8开始,接口中可以有默认方法,即default修饰的方法,此方法可以让。需求2:stuList获取流对象,把原来流中的学生对象替换成学生姓名。的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。换言之,集合是存储数据的容器,流是使用操作这些数据的技术。

m0_57463864的博客 988

AI如何帮你快速掌握JDK 1.8新特性

最惊喜的是写完的Demo可以直接一键部署成可访问的服务,把学习成果立刻转化为实际可运行的案例,这种即时正反馈对保持学习动力太重要了。作为一个从Java 7过渡到Java 8的老程序员,我深刻理解学习新语法时的纠结:文档晦涩难懂,示例不够直观,自己写起来总感觉差点意思。建议刚开始学Java 8的朋友,先选一个自己项目中的实际场景(比如日志处理或数据统计),然后用AI辅助逐步重构为Lambda和Stream写法,这种学以致用的方式效果远超单纯看教程。更棒的是,AI会解释每个参数的含义,比如为什么这里可以用。

AmberLeopard26的博客 679

JDK8新特性(一)

JDK8引入了诸多令人兴奋的新特性,其中最引人注目的包括Lambda表达式、方法引用、默认方法、Stream API、新的日期和时间API以及Optional类等。这些新特性使得Java更加灵活和强大,简化了代码,提高了开发效率,并带来了真正的函数式编程风格。此外,JDK8还从JVM中移除了“永久代”,代之以元空间,使得内存管理更加高效。总之,JDK8为Java开发者带来了更多的可能性,使得Java焕发出了新的活力。

qq_54421200的博客 1539

day14--JDK8~17新特性(下):9到17的新特性

讲师:尚硅谷-宋红康(江湖人称:康师傅)

aa35434的博客 955

jdk1.8新特性梳理

前言 jdk1.8的新特性梳理,方便自己记忆和小伙伴们快速掌握 零、回顾一个抽象类 在jdk1.8之前,因为接口里只能做方法定义不能有方法的实现,因此我们通常会在抽象类里面实现默认的方法{一般这个默认的方法是抽象后公用的方法,不需要每一个继承者都去实现,只需调用即可}。就像下面这样; 在定义的时候; public abstract class AFormula { abstract doubl...

wwwvipp的博客 1万+

JDK 每半年就会更新一次新特性,再不掌握就要落伍了:JDK8 的新特性

该图片由Alexandr Podvalny在Pixabay上发布 你好,我是看山。 本文收录在 《Java 进阶》 系列专栏中。 从 2017 年开始,JDK 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中仍有近半的环境使用 JDK8,有近半的人转移到了 JDK11,随着 JDK17 的发布,相信比例会有所变化。 因此,准备出一个系列,配合示例讲解,阐述从..

沉潜飞动 4637

JDK11新特性

介绍jdk11的新特性,包括ZGC的出现,String,Stream和Optional的增强。

m0_62946761的博客 7634

【工作记录】JDK8到JDK21都更新了哪些新特性

本文整理了jdk8-jdk21各个版本的新特性信息,并给出了一些简单示例。

泽济天下的专栏 3133

JDK1.8新特性(二):Optional 类

在我们的开发中,NullPointerException 可谓是随时随处可见,为了避免空指针异常,我们常常需要进行一些防御式的检查,所以在代码中常常可见 if(obj != null) 这样的判断。幸好在 JDK1.8 中,Java 为我们提供了一个 Optional 类,Optional 类能让我们省掉繁琐的非空的判断。 下面我们先快速过一下 Optional 中为我们提供的方法: 方法 描述 of 把指定的值封装为 Optional 对象,如果指定的值为 null,则抛出 NullPoi

JavaInfo 350

JDK1.8新特性详解

函数式接口是一种只包含一个抽象方法的接口。函数式接口通常作为函数式编程和Lambda表达式的基础。Java 8为常见的函数式编程场景提供了专门的函数式接口,比如,和等。:断言型接口,输入一个参数T,返回一个布尔值,用于执行一些判断逻辑。:函数型接口,输入一个参数T,返回一个结果R,用于执行一些转换逻辑。:消费型接口,输入一个参数T,表示消费掉这个参数,执行一些操作但没有返回值。:供给型接口,返回一个数据T,用于执行一些数据生成操作。Filter:过滤,用于过滤出满足条件的元素。Map。

weixin_44251099的博客 3975
上一篇: JDK8新特性之Stream快速入门
pbxs
博客等级 码龄14年 94粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值