文档章节

Java8之Optional

0x0001
 0x0001
发布于 11/14 16:29
字数 627
阅读 14
收藏 0

java.lang.NullPointException这个异常,写过几年Java的没人没遇到过这个, 为了避免抛出这个异常,我们经常会写出这样的代码:

User pet = userDao.findById(1);
if (null != user) {
	return user.getName();
}

扎心的是,我们经常会忘记写这个判断, 然后NullPointException就来了.

Java的世界里,为了避免这个问题, 有一个模式叫做Null Object,主要做法就是为某个可能为null的对象单独创建一个特殊的对象, 如Collections.emptyList(), Collections.emptyMap();等, 这个做法非常繁琐,如果想大规模使用的话,我们几乎要为每个类编写Null Object.

当返回可空对象时,会遇到的另外一个问题是,IDE无法帮助我们提前提示可能出错的情况,以前的做法是,在可能返回空对象的方法上加入@Nullable注解来让IDE识别到这种情况.

还好, 在Java8中,为我们提供了另外一种选择Optional(Guava中存在很久的概念).Optional是对可以为空的对象的一种封装.

那自从有了Optional后情况会变得怎么样呢?

如何创建一个Optional对象

// 明确不为空的时候使用, 如果object为空,会抛出 NullPointExceptioin
Optional.of(object);
// 可能为空的时候使用
Optional.ofNullable(object);
// 肯定为空的时候使用
Optional.empty();

当我我们拿到一个Optional对象的时候,能做些什么呢

// 第一种用法, 普通非空检查判断
public Optional<String> getUserNameById(int id) {
	Optional<User> userOptioanl = userDao.findById(1);
	if (userOptional.isPersent()) {
		final User user = userOptional.get();
		return Optional.ofNullable(user.getName());
	}
	return Optional.empty();
}

// 第二种, 如果为空,抛出异常
public Optional<String> getUserNameById(int id) throws UserNotFoundException {
	Optional<User> userOptioanl = userDao.findById(1);
	final String name = userOptional.orElseThrow(UserNotFoundException::new).getName();
	return Optioanl.ofNullable(name);
}

// 第三种, 当对象为空时,给一个默认值
public void userDoSomething(int userId) {
	final User manager = getManager();
	Optional<User> userOptioanl = userDao.findById(1);
	// 如果找不到这个人, 事情交给经理去做
	userOptional.orElse(manager).doSomething();
}

// 第四种, 使用lambda
public void userDoSomething(int userId) {
	final User manager = getManager();
	Optional<User> userOptioanl = userDao.findById(1);
	userOptioanl.ifPresent(user -> {
  		user.doSomething();  
	});
}

其它的filter, map, flatMap等方法和Java8 Streams API类似

如果想期待代码量变少,可能要失望了, 当从代码量来说,甚至比原来的代码都多,但好处就是,绝对不会忘记做非空判断, 除非每次都傻傻的直接调用get

© 著作权归作者所有

共有 人打赏支持
0x0001

0x0001

粉丝 16
博文 4
码字总数 3146
作品 0
程序员
私信 提问
Java系列 – 用Java8新特性进行Java开发太爽了(续)

本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome-2/ 前言 上周, 我们谈论了关于Java8的新特性有那些, 什么是函数式编程, 什么是Lambda表达式, 这...

PereTang
2017/07/18
0
0
Java8 lambda使用总结-结合实例介绍

1.Java8 新特性介绍 写java的同学对java8肯定知道 那么java8到底有哪些特性呢,总结如下: 最核心的当然是函数式编程了,写代码非常简单,请看下面详细例子介绍 2.Java8 lambda使用总结-结合...

陈小扁
2016/07/01
2K
1
java8的重要特性及其他,昨天答应的发java8╭(╯ε╰)╮

【注意】本文节选自是 DZone 指南 Java 生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由OneAPM工程师翻译。 ...

默默学习中
2016/03/28
1K
9
用Optional取代null

null引发的问题以及为什么要避免null引用 先看一个例子 意思也就是说获取一个人的车的保险公司的名称。可以看到的是,并不是每一个都有车,也并不是每一个车都有保险。这样的获取是会发生Nul...

小鱼嘻嘻
06/02
0
0
为什么选择 Java 8 ?

本文是 DZone 指南 Java 生态系统的专题文章。点击链接可阅读更多见解深刻的文章、行业统计信息,系 OneAPM工程师编译整理。 在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调...

OneAPM蓝海讯通
2015/11/04
117
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据学习有哪几个步骤

目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都从没接触过大数据,对于应该如何学习大数据一头雾水。大数据学习并不是高深莫测的,虽然它并没有多简单,但是通过努力...

董黎明
21分钟前
4
0
shell习题_3

1:监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功; 如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理...

芬野de博客
21分钟前
3
0
Android 9.0 优势探讨

我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献...

问题终结者
38分钟前
4
0
vue 组件使用中的一些细节点

细节一 基础例子 运行结果: 以上大家都懂,这边就不多说,回到代码里,有时候我们需要 tbody 里面每一行是一个子组件,那我们代码可以怎么写呢?我们可以这样写,定义一个全局组件,如下: ...

peakedness丶
45分钟前
2
0
vue 之 css module的使用方法

动手之前先配置项目,网上很多文章说需要下载css-loader插件,Vue中的vue-loader已经集成了 CSS Modules,因此删掉也能正常运行 在vue.config.js中添加如下配置 `css: {``loaderOptions: ...

前端小攻略
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部