搜索
首页Javajava教程分享Java8中新引入的类Optional实例代码

Optional是Java8新引入的类
这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:

Person person = people.find("John Smith");
if (person != null) {
 person.doSomething();
}

遗憾的是,在绝大多数Java代码里,我们常常忘记了判断空引用,所以,NullPointerException便也随之而来了。
“Null Sucks.”,这就是Doug Lea对空的评价。作为一个Java程序员,如果你还不知道Doug Lea是谁,那赶紧补课,没有他的贡献,我们还只能用着Java最原始的装备处理多线程。
"I call it my billion-dollar mistake.",有资格说这话是空引用的发明者,Sir C. A. R. Hoare。你可以不知道Doug Lea,但你一定要知道这位老人家,否则,你便没资格使用快速排序。
在Java世界里,解决空引用问题常见的一种办法是,使用Null Object模式。这样的话,在“没有什么”的情况下,就返回Null Object,客户端代码就不用判断是否为空了。但是,这种做法也有一些问题。首先,我们肯定要为Null Object编写代码,而且,如果我们想大规模应用这个模式,我们要为几乎每个类编写Null Object。

幸好,我们还有另外一种选择:Optional。Optional是对可以为空的对象进行的封装,它实现起来并不复杂。在某些语言里,比如Scala,Optional实现成了语言的一部分。而对于Java程序员而言,Guava为我们提供了Optional的支持。闲言少叙,先来如何使用Optional,完成前面的那段代码。

Optional person = people.find("John Smith");
if (person.isPresent()) {
 person.get().doSomething();
}

这里如果isPresent()返回false,说明这是个空对象,否则,我们就可以把其中的内容取出来做自己想做的操作了。
如果你期待的是代码量的减少,恐怕这里要让你失望了。单从代码量上来说,Optional甚至比原来的代码还多。但好处在于,你绝对不会忘记判空,因为这里我们得到的不是Person类的对象,而是Optional。
下面是个人练习的代码

public class OptionalTest {
	/**
	 * of后面接给optional设置的值 但是不能为空 如果为空会报空指针异常
	 * @Title: ofTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ofTest()
	{
		Optional<String> optional = Optional.of("123");
		System.out.println(optional.get());
		try
		{
			optional = Optional.of(null);
			System.out.println(optional.get());  //get方法是获取optional的值 类型取决于声明的时候
		}catch(NullPointerException e)
		{
			System.out.println("空指针异常");
		}
	}
	/**
	 * ofNullable 和of类似 但是ofNullable可以设置null值  如果是Null值得话取值会报NoSuchElementException 异常
	 * @Title: ofNullableTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ofNullableTest()
	{
		Optional<String> optional = Optional.ofNullable("123");
		System.out.println(optional.get());
		try
		{
			optional = Optional.ofNullable(null);
			System.out.println(optional.get());
		}catch(NoSuchElementException e)
		{
			System.out.println("NoSuchElementException 异常");
		}
	}
	
	/**
	 * ifPresent用来判断optional中有没有值存在 如果有则为真
	 * @Title: isPresentTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void isPresentTest()
	{
		Optional<String> optional =  Optional.ofNullable(null);
		if(optional.isPresent())
		{
			System.out.println(optional.get());
		}
		else
		{
			System.out.println("值为空");
		}
	}
	/**
	 * ifPresent和isPresent类似 只不过它支持λ表达式
	 * @Title: ifPresentTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ifPresentTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		optional.ifPresent(var ->{
			System.out.println(var);
		});
	}
	
	/**
	 * orElse方法,如果值为空的话会用参数中的值去替换 即设置默认值
	 * @Title: orElseTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void orElseTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		System.out.println(optional.orElse("有没有"));
		optional = Optional.ofNullable(null);
		System.out.println(optional.orElse("有没有"));
	}
	/**
	 * orElseGet方法 和orElse类似 不过此方法接受Supplier接口的实现用来生成默认值
	 * @Title: orElseGetTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void orElseGetTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		System.out.println(optional.orElseGet(()->"123456"));
		optional = Optional.ofNullable(null);
		System.out.println(optional.orElseGet(()->"123456"));
	}
	/**
	 * map方法  如果有值则会对值进行mapping中的处理 处理结果存在则创建并返回Optional类型的结果 否则返回空
	 * @Title: mapTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void mapTest()
	{
		Optional<String> optional =  Optional.ofNullable("abc");
		System.out.println(optional.map(var->var.toUpperCase()).get());
	}
	/**
	 * flatMap和map类似 只不过mapping中必须返回Option类型的数据
	 * @Title: flatMapTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void flatMapTest()
	{
		Optional<String> optional =  Optional.ofNullable("abc");
		System.out.println(optional.flatMap(var->Optional.of(var.toUpperCase())).get());
	}
	/**
	 * filter对optional进行过滤,mapping中为过滤的条件  如果不满足条件 返回一个为空的Optional
	 * @Title: filterTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
	@Test
	public void filterTest()
	{
		try
		{
			Optional<String> optional = Optional.ofNullable("一二三四五六七八");
			System.out.println(optional.filter(var ->var.length()>6).get());
			System.out.println(optional.filter(var ->var.length()<6).get());
		}catch(NoSuchElementException e)
		{
			System.out.println("optional的值为空");
		}
	}

【相关推荐】

1. Java 8新增的API--Optional 的使用实例

2. 解析Java 8 Optional类实例教程

以上是分享Java8中新引入的类Optional实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java仍然是基于新功能的好语言吗?Java仍然是基于新功能的好语言吗?May 12, 2025 am 12:12 AM

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

是什么使Java很棒?关键特征和好处是什么使Java很棒?关键特征和好处May 12, 2025 am 12:11 AM

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

前5个Java功能:示例和解释前5个Java功能:示例和解释May 12, 2025 am 12:09 AM

Java的五大特色是多态性、Lambda表达式、StreamsAPI、泛型和异常处理。1.多态性让不同类的对象可以作为共同基类的对象使用。2.Lambda表达式使代码更简洁,特别适合处理集合和流。3.StreamsAPI高效处理大数据集,支持声明式操作。4.泛型提供类型安全和重用性,编译时捕获类型错误。5.异常处理帮助优雅处理错误,编写可靠软件。

Java的最高功能如何影响性能和可伸缩性?Java的最高功能如何影响性能和可伸缩性?May 12, 2025 am 12:08 AM

java'stopfeatureSnificallyEnhanceItsperFormanCeanDscalability.1)对象 - 方向 - incipleslike-polymormormormormormormormormormormormormorableablefleandibleandscalablecode.2)garbageCollectionAutoctionAutoctionAutoctionAutoctionAutoctionautomorymanatesmemorymanateMmanateMmanateMmanagementButCancausElatenceiss.3)

JVM内部:深入Java虚拟机JVM内部:深入Java虚拟机May 12, 2025 am 12:07 AM

JVM的核心组件包括ClassLoader、RuntimeDataArea和ExecutionEngine。1)ClassLoader负责加载、链接和初始化类和接口。2)RuntimeDataArea包含MethodArea、Heap、Stack、PCRegister和NativeMethodStacks。3)ExecutionEngine由Interpreter、JITCompiler和GarbageCollector组成,负责bytecode的执行和优化。

什么是使Java安全安全的功能?什么是使Java安全安全的功能?May 11, 2025 am 12:07 AM

Java'ssafetyandsecurityarebolsteredby:1)strongtyping,whichpreventstype-relatederrors;2)automaticmemorymanagementviagarbagecollection,reducingmemory-relatedvulnerabilities;3)sandboxing,isolatingcodefromthesystem;and4)robustexceptionhandling,ensuringgr

必不可少的Java功能:增强您的编码技巧必不可少的Java功能:增强您的编码技巧May 11, 2025 am 12:07 AM

javaoffersseveralkeyfeaturesthatenhancecodingskills:1)对象 - 方向 - 方向上的贝利奥洛夫夫人 - 启动worldentities

JVM最完整的指南JVM最完整的指南May 11, 2025 am 12:06 AM

thejvmisacrucialcomponentthatrunsjavacodebytranslatingitolachine特定建筑,影响性能,安全性和便携性。1)theclassloaderloader,links andinitializesClasses.2)executionEccutionEngineExecutionEngineExecutionEngineExecuteByteCuteByteCuteByteCuteBytecuteBytecuteByteCuteByteCuteByteCuteBytecuteByteCodeNinstRonctientions.3)Memo.3)Memo

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具