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

本文介绍了Java8中的Optional类,包括flatMap、isPresent()、ifPresent()和filter(Predicate)方法的用法,以及如何在实际编程中优化代码结构,降低冗余检查。同时提到了面试中常问的技术点和学习资源,如Java开发、集合、多线程等。
摘要由CSDN通过智能技术生成

这时候取 name 的写法如下所示

String city = Optional.ofNullable(user).map(u-> u.getName()).get();

对于 flatMap 而言:

如果 User 结构是下面这样的

public class User {

private String name;

public Optional getName() {

return Optional.ofNullable(name);

}

}

这时候取 name 的写法如下所示

String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();

4、isPresent() 和 ifPresent(Consumer<? super T> consumer)

这两个函数放在一起记忆,isPresent即判断 value 值是否为空,而ifPresent就是在 value 值不为空时,做一些操作。这两个函数的源码如下

public final class Optional {

//省略…

public boolean isPresent() {

return value != null;

}

//省略…

public void ifPresent(Consumer<? super T> consumer) {

if (value != null)

consumer.accept(value);

}

}

需要额外说明的是,大家千万不要把

if (user != null){

// TODO: do something

}

给写成

User user = Optional.ofNullable(user);

if (Optional.isPresent()){

// TODO: do something

}

因为这样写,代码结构依然丑陋。博主会在后面给出正确写法

至于ifPresent(Consumer<? super T> consumer),用法也很简单,如下所示

Optional.ofNullable(user).ifPresent(u->{

// TODO: do something

});

5、filter(Predicate<? super T> predicate)

不多说,直接上源码

public final class Optional {

//省略…

Objects.requireNonNull(predicate);

if (!isPresent())

return this;

else

return predicate.test(value) ? this : empty();

}

filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty

用法如下

Optional user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);

如上所示,如果 user 的 name 的长度是小于 6 的,则返回。如果是大于 6 的,则返回一个 EMPTY 对象。

实战使用

例一

在函数方法中

以前写法

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(“取值错误”);

}

JAVA8 写法

public String getCity(User user) throws Exception{

return Optional.ofNullable(user)

.map(u-> u.getAddress())

.map(a->a.getCity())

.orElseThrow(()->new Exception(“取指错误”));

}

例二

比如,在主程序中

以前写法

if(user!=null){

dosomething(user);

}

JAVA8 写法

Optional.ofNullable(user)

.ifPresent(u->{

dosomething(u);

});

例三

以前写法

public User getUser(User user) throws Exception{

if(user!=null){

String name = user.getName();

if(“zhangsan”.equals(name)){

return user;

}

}else{

user = new User();

user.setName(“zhangsan”);

return user;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入**

[外链图片转存中…(img-NjqtL7ak-1712596162228)]

[外链图片转存中…(img-0wj5F7bh-1712596162228)]

[外链图片转存中…(img-CnSAuIHh-1712596162228)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值