Java8 lambda用 Optional 处理非空操作

Java8新特性之Lambda,Stream,Optional 前言 Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。 1. Lambda表达式 1.1 何为Lamdba表达式 Lambda表达式理解为简洁地表示可传递的一种表达式:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 最简单的Lambda表达式可由逗号分隔的参数列表、->... 阅读详情

 Optional是Java8里面用避免空指针的,无论什么语言“空指针异常”总会是最困扰人的东西,老实说这很有可能就是逻辑错误。为了避免这样的错误,Java8建议使用Optional来培养[避免空指针]的好习惯。Optional的方法大纲如下(冒号后表示返回值):

empty() : Optional<T>

of(T) : Optional<T>

ofNullable(T) : Optional<T>

get() : T

isPresent() : boolean

ifPresent(Consumer<? super T>) : void

filter(Predicate<? super T>) : Optional<T>

map(Function<? super T, ? extends U>) : Optional<U>

flatMap(Function<? super T, Optional<U>>) : Optional<U>

orElse(T) : T

orElseGet(Supplier<? extends T>) : T

orElseThrow(Supplier<? extends X>) : T

 

有个求累加的例子是这么写的。


@Test
public void reduceWithInt() {
    int sumAll = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);// 给一个0是用来启动,的,若给-1,结果会是9</span>
    System.out.println(sumAll);// 10
}
例子中调用reduce方法时,我们给了一个初始值0.若我们不给初始值呢会出现什么情况?不给初始值,我们的代码该这样写:

@Test
public void reduceTest() {
    Optional<Integer> sumAll = Stream.of(1, 2, 3, 4).reduce(Integer::sum);// 注意返回值类型
    System.out.println(sumAll);// Optional[10]     注意输出值不再是10了
}
那么这个Optional是个什么呢?Optional<T>是Java用来解决空指针异常的一个东西。不过呢,我们想要得到的结果是10,但返回的是Optional[10],怎么把10弄出来?看下面代码

@Test
public void reduceTest() {
    Integer testInt[]={1, 2, 3, 4};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll.get());// 10
}
调用一次Optional的get()方法,就得到真实结果了。猜想一下下面代码会是什么?

@Test
public void reduceTest() {
    Integer testInt[]={};//空数组
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll.get());
}
居然保错了,亲!

java.util.NoSuchElementException: No value present

at java.util.Optional.get(Optional.java:135)

看到了么,所谓避免“空指针异常”就是用“元素缺失异常”来替换?当然不是啦。这里对空数组没有做任何操作,没有初始值,当然是“null”了,为了不抛异常。只有在确定不为空的时候才调用get()方法了,怎么知道为不为空呢,那就是调用isPresent()方法判断是否“元素存在”,存在就可以调用。比如下面代码:

@Test
public void reduceTest() {
    Integer testInt[]={};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll);// Optional.empty
    if(sumAll.isPresent()){
        System.out.println(sumAll.get());
    }else{
        System.out.println(sumAll.empty());// Optional.empty
    }
}
从这段代码,我们看到了,当Optional里面值缺失时,直接打印Optional和调用empty()方法,得到的结果是一样的,即打印“Optional.empty”字符串。你要是觉得多一个判断好麻烦,那么没问题,你可以用ifPresent来代替,在ifPresent里面加入业务逻辑,只有不为空的时候才处理。上面的代码可以改成如下:

@Test
public void reduceTest() {
    Integer testInt[] = {};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll);
    sumAll.ifPresent(x -> {
        System.out.println(x); //sumAll不为空的时候,打印x的值;为空的时候,不做任何操作
    });
}
Java8这么搞,究竟几个意思。其实呢,人家的意思就,今后忘掉“空”(null)吧。要养成良好的习惯,不要出现“空”。但是为了兼容“空”状态所以用了一个“缺省”。在上面例子中我们可以给Optional一个默认值0,即如下写法。

@Test
public void reduceTest() {
    Integer testInt[]={};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll.orElse(0));// 0
}
这样程序就不会报错了,值缺省(null)时会返回默认值,但是这样写有个问题,那就是默认值是先new出来的,占有一定空间呀,有没有一种方式,缺省时再去new呢。有那就是orElseGet(Supplier<? extends T>),这段代码就可以改成下面这样:

@Test
public void reduceTest() {
    Integer testInt[]={};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll.orElseGet(() -> 0)); // 0
}
虽然看到的结果是一样,但是这种写法更省内存空间了。

  可能有这种情况,就是,值出现缺省状态,在业务上就是错了,这个时候你很想抛个特定的异常出来,怎么弄呢。你只需要调用orElseThrow方法就可以了,比如用.orElseThrow(() -> new Throwable("不能为空"))。

   以上所有例子中Optional都是方法返回给我们的,其实我们也可以自己new 一个Optional但是不是使用new关键字。而是使用 of(T)以及ofNullable(T) 等方法。但是of和ofNullable是有区别的。我们看看下面这段代码:

@Test
public void reduceTest() {
    Optional<List<Integer>> optional = Optional.of(new ArrayList<>());//of()里面不能传入null
    System.out.println(optional.get()); // []
    Optional<List<Integer>> optional1 = Optional.ofNullable(new ArrayList<>());
    System.out.println(optional1.get()); // []
    Optional<List<Integer>> emptyOptional = Optional.empty();
    Optional<List<Integer>> emptyOptional2 = Optional.ofNullable(null);
    System.out.println(emptyOptional.equals(emptyOptional2)); //true
}
Of里面必须输入一个值,也就是说使用of创建的Optional对象一定不是empty的,而ofNullable是可以创建一个empty的Optional对象。

Optional除了这么苍白地使用,还可配合过滤转换一起使用,比如我们要对{1,2,3,4}累加,若结果大于7我们才返回真实值。那么我们可以这样写:

@Test
public void reduceTest() {
    Integer testInt[]={1,2,3,4};
    Optional<Integer> sumAll = Stream.of(testInt).reduce(Integer::sum);
    System.out.println(sumAll.filter(x -> x>7));//Optional[10]
}
若计算结果是6,那么打印的值会是Optional.empty。当然还可以进行转换,比如下面是,把小写转换成大写的代码:

@Test
public void reduceTest() {
    String testS[]={"hello"," ","world"," ","!"};
    Optional<String> sumAll = Stream.of(testS).reduce(String::concat);
    System.out.println(sumAll.map(x-> null));//Optional.empty
    System.out.println(sumAll.map(x-> x.toUpperCase()));//Optional[HELLO WORLD !]
}
这里用到了map就得说说Optional的flatMap了,其实flatMap跟map的操作非常相似,但是呢,flatMap里面传入的东西必须是Optional对象。我们看到map可以返回null可以返回x.toUpperCase(),但是flatMap是不可以的。上面的例子我们改由flatMap,就该这么写:

@Test
public void reduceTest() {
    String testS[]={"hello"," ","world"," ","!"};
    Optional<String> sumAll = Stream.of(testS).reduce(String::concat);
    System.out.println(sumAll.flatMap(x-> Optional.ofNullable(null)));//Optional.empty
    System.out.println(sumAll.flatMap(x-> Optional.of(x.toUpperCase())));//Optional[HELLO WORLD !]
}
好,至此,Optional里面的方法就算讲完一遍了,没讲的,都是从Object类继承下来的方法,没啥好讲的了。
 

Java非空判断之Optional Lambda流式操作是Java8中重要的特性,lambda表达式核心概念为 函数式接口、::、-> 等基本语法,可以大大减少代码量的编写,使代码更加优雅。1、从结果来看,orElse() 和 orElseGet() 的作用是一样的,都是当前置参数为空的情况下会调用此两者方法。2、区别在于无论前置参数是否为空都会执行 orElse(),只有前置参数为空才会执行行 orElseGet()3、-> 的语法为 (变量或参数)->{代码体},是匿名函数的写法。1、只有一个抽象函数的接口,就是函数式接口。 阅读详情

相关推荐

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736

Kotlin笔记(一):Lambda,非空判断,函数默认参数

Kotlin中的Lambda表达式,空指针判断及函数的默认参数值

Waruler的博客 1252

告别密码本!用Windows NPS给华为/华三交换机做Radius认证,SSH登录更安全

本文详细介绍了如何利用Windows NPS实现华为/华三交换机的Radius认证,提升SSH登录安全性。通过集中化管理、精细化控制和完整审计追踪,企业可告别传统密码本,大幅提升网络设备管理效率。文章包含NPS服务部署指南、交换机配置详解及调试技巧,助力企业构建安全高效的统一认证体系。

weixin_42549723的博客 418

Java 8 Lambda操作List

目录1.list2.判断字符串不为null/空3.判断字符串不为null/空 , 并且合并成字符串4.获取对应的平方数5.list--distinct去重6.list--sorted 排序并且去重7.list--filter 获取空字符串的数量8.list--limit 方法用于获取指定数量的流9.list--并行(parallel)9.list--统计 1.list List<String> strings = Arrays.asList("a", "", "c", "d", "e", "",

qq_41525524的博客 3539

华为OD机试双机位C卷-开心消消乐(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【开心消消乐】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 开心消消乐。

qq_45776114的博客 1512

C# 上位机 YOLO 实战:从数据采集到目标识别的全流程拆解

本文以工业螺栓缺陷检测为例,完整拆解了C#上位机+YOLO从数据采集到目标识别的全流程。数据采集:保证图像质量,线程安全采集,必要时归档数据;预处理:适配YOLO模型输入格式,复用对象减少内存开销;推理解析:正确解析张量结果,过滤低置信度目标;落地环节:可视化展示结果,实现工业交互和日志记录。

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

Java小知识:使用Lambda表达式,判断字段非空后进行求和

使用方式 List<PrescriptionDTO> entryValue = entry.getValue(); //数据处理 BigDecimal sum = entryValue.stream().map(PrescriptionDTO::getMoney). filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); 函数拆解分析: 1. map(PrescriptionDTO::get

危险、的博客 4816

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2949

lambda表达式:Optional类源码解析,方法引用详解,默认方法详解

Optional(重要) 解决NPE Nullpointerexception doc 一个容器对象可能包含也可能不包含非空值。如果容器存在值,isPresent()将返回true,get()将返回该值。 提供了依赖于是否存在包含值的其他方法,例如orElse()(如果值不存在,则返回默认值)和ifpresent()(如果值存在,则执行代码块)。 这是一个基于值的类;对可选实例使用标识敏感操作(包括引用相等(==)、标识哈希代码或同步)可能会产生不可预知的结果,应避免 基于值的类 某些类(例如java

qq_42261668的博客 864

第58篇:AI技术实战:基于深度学习的智能音频内容审核系统

深度学习技术为智能音频内容审核系统提供了强大的支持,通过CNN、RNN和Transformer等模型,能够实现高效的音频内容检测和过滤。使用TensorFlow和Keras可以快速构建和训练音频审核模型,而预训练模型则可以进一步提升性能。数据预处理、特征提取和性能优化是提升智能音频审核系统性能的关键。希望本文的代码示例和注意事项能帮助你更好地理解和应用这些技术。接下来,我们将继续探索更多AI技术实战案例。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 705

电子元件及其规格书的查找与理解

本内容收录:在电子开发或维修过程中,查找电子元件及其规格书心得体会,以及元件规格书的理解,系个人多年实战经验的系统梳理。内容着重介绍贴片元件代码反查型号的实用技巧,并以三款典型疑难元件为例,详述其完整查找过程与最终型号确认。

让你爱上电路设计 3987

Java 8 Optional的正确姿势

调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题。新版本的Java,比如Java 8引入了一个新的Optional类。Optional类的Javadoc描述如下: 这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回t

等风的帆 2万+

道威棱镜的设计参考

道威棱镜的设计参考

weixin_72050316的博客 379

JAVA8之妙用Optional解决判断Null为空的问题

JAVA8之妙用Optional解决判断Null为空的问题 引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在user为null时,是有可能报NullPoint...

zjhred的博客 10万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java8新特性-Optional

Java 8引入了一个重要的新特性,即Optional类。Optional类是为了解决空指针异常而设计的。在Java中,当我们尝试访问一个空对象的属性或调用其方法时,很容易抛出NullPointerException。这种异常可能会导致程序崩溃或产生意外结果。Optional类的目的是提供一种更好的处理空值的方式。它可以包含一个非空的对象,也可以表示一个空值。使用Optional类,我们可以避免直接操作空对象,从而减少NullPointerException的发生。

蒾酒的博客 1505

Devexpress16.2.6破解工具

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

Guava Optional 和 Java 8 optional

Null  上帝创造了男人,多年之后他老人家后悔了! Null的发明人同时也是快速排序的发明人表达对Null的忏悔称:“”这是个造成上亿美元损失的错误“。

lessisawesome 的专栏 6429

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 8 特性: Lambda 表达式、Stream API、Optional 类等

包提供的接口能够帮助我们以更加简洁的方式实现函数式编程。Lambda表达式和这些接口的结合,使得代码更加简洁和易于理解。熟练掌握这些接口,可以在日常开发中写出更优雅的代码。

qq_36534560的博客 1082

Java8新特性 Lambda、Stream、Optional实现原理

Java8新特性lambda&stream&optional实现原理接口中默认方法修饰为普通方法Lambda表达式什么是Lambda表达式 接口中默认方法修饰为普通方法 在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的,由于这些修饰符都是默认的。 接口定义方法:public 抽象方法 需要子类实现 接口定义变量:public、static、final 在JDK 1.8开始 支持使用stat

用生命研发技术 1578

利用Java 8 Optional 来进行null处理

短文中,介绍了如何利用Java 8 Optional 来进行null处理

timchen525的专栏 6386

Java8中的lambda表达式、::符号和Optional类

文章目录Java8中的lambda表达式、::符号和Optional类0. 函数式编程1. lambda表达式2. 双冒号::符号3. Optional类 Java8中的lambda表达式、::符号和Optional类 0. 函数式编程     函数式编程(Functional Programming)属于编程范式(Programming Paradigm)中的用语,此外还有命令式编程(Imperative Programing)等,有兴趣的同学可以自行了解,我们这里

WAXXD的博客 2360

【Java 8】 Optional 协助判空

Optional 类是 JDK1.8 加入的类,新功能,常用于协助判空。什么叫协助判空,就是代码中的对象可能会有null 的情况,对null 进行操作可能会产生 NPE(Null Pointer Exception),所以在代码里,你就需要经常 if 它们看它们是否为 null;然而 Optional 出现了,使用了他,你就不用一直 if 是不是为空了。比如说而 proto 为 null,那么就会NPE。例子1:if (user!

qq_43636011的博客 1786

JDK8新特性(Lambda、Stream、Optional)

1.Lambda表达式 Lambda表达式的使用 1.举例: (o1,o2) -> Integer.compare(o1,o2); 2.格式: -> :lambda操作符 或 箭头操作符。 ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)。 ->右边:lambda体 (其实就是重写的抽象方法的方法体)。 3.Lambda表达式的使用:(分为6种情况介绍) 总结: ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个

星海IT学习之路 1350

JAVA1.8中的Lambda表达式("->")用法

这是最近看到过的最通俗易懂的Lambda语法说明了,非常清晰!还不会用的来学习一下吧! 转自知乎:https://www.zhihu.com/question/20125256/answer/324121308 什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块...

看山不是山 4723

Java8函数式编程(Lambda表达式,Stream流,Optional)

lambda表达式是Java8的一个新特性,从本质上来讲是一个匿名函数可以使用这个匿名函数实现接口中的方法,并且非常简洁。通常来讲,使用 lambda表达式 是为了。关于接口实现,可以有很多种方式来实现。例如L设计接口的实现类、使用匿名内部类。但是lambda表达式比这两种方式都简单。

qq_62767608的博客 4064

JDK8新特性详解Lambda、StreamAPI、Optional等

JDK8学习笔记 Lambda表达式、StreamAPI、Optional、时间日期等 包含源码剖析、代码示例、学习视频网址、代码源码

大爱仙尊 2万+

JAVA8 Stream Lambda Optional 精析

Java8 新特性 许多特性在前面已经得到了体现:如Java 常用类、枚举类和注解、Java 集合中新增的红黑树等等 Java8的好处: 速度更快 代码更少(增加了新的语法: Lambda表达式)强大的 Stream API 便于并行 最大化减少空指针异常:Optional Nashorn引擎,允许在JVM上运行JS应用 并行流与串行流 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。 Java 8 中将并行进行了优化

qq_45560445的博客 252
上一篇: 哥们,你们消息中间件是如何落地的?(M3)
下一篇: java8 流处理字符串---分隔字符串
Mr_baci
博客等级 码龄9年 1万+粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值