阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第12章:开发支持类库:课时48:Optional类

Optional类的主要功能是进行null 的相关处理,在以前进行程序开发的时候,如果为了防止程序之中出现的空指向异常,往往可以追加有null 的验证。
范例:传统的引用传递问题

package cn.mldn.demo;
public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		MessageUtil.useMessage(MessageUtil.getMessage());
	}
}
class MessageUtil {
	private MessageUtil() {}
	public static IMessage getMessage() {
		return null;
	}
	public static void useMessage(IMessage msg) {
		if (msg != null) {
			System.out.println(msg.getContent()); // 有可能因为出现null,而导致空指向
		}
	}
}
interface IMessage {
	public String getContent();
}
class MessageImpl implements IMessage {
	@Override
	public String getContent() {
		return "www.mldn.cn";
	}
}

在引用接收的一方往往都是被动的进行判断,所以为了解决这种被动的处理操作,在Java类中提供有一个Optional 的类,这个类可以实现null 的处理操作,在这个类里面提供有如下的一些操作方法:
返回空数据:public static Optional empty​();
获取数据:public T get​();
保存数据,但是不允许出现null:public static Optional of​(T value);
|—如果在保存数据的时候存在有null,则会抛出NullPointerException异常;
保存数据,允许为空:public static Optional ofNullable​(T value);
空的时候返回其它数据:public T orElse​(T other);
在这里插入图片描述
范例:修改程序,按照正规的结构完成

package cn.mldn.demo;

import java.util.Optional;

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		IMessage temp = MessageUtil.getMessage().get(); // 获取数据
		MessageUtil.useMessage(temp);
	}
}
class MessageUtil {
	private MessageUtil() {}
	public static Optional<IMessage> getMessage() {
		return Optional.of(new MessageImpl()); // 有对象
	}
	public static void useMessage(IMessage msg) {
		if (msg != null) {
			System.out.println(msg.getContent()); // 有可能因为出现null,而导致空指向
		}
	}
}
interface IMessage {
	public String getContent();
}
class MessageImpl implements IMessage {
	@Override
	public String getContent() {
		return "www.mldn.cn";
	}
}

如果说现在数据保存的内容是null,则就会在保存处出现异常:

	public static Optional<IMessage> getMessage() {
		return Optional.of(null); // 有对象
	}

Exception in thread "main" java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:221)
	at java.base/java.util.Optional.<init>(Optional.java:107)
	at java.base/java.util.Optional.of(Optional.java:120)
	at MLDNProject/cn.mldn.demo.MessageUtil.getMessage(JavaAPIDemo.java:14)
	at MLDNProject/cn.mldn.demo.JavaAPIDemo.main(JavaAPIDemo.java:7)

由于Optional 类中允许保存有null 的内容,所以在数据获取的时候也可以进行null的处理。但是如果为null,则在使用get()获取数据的时候就会出现“Exception in thread “main” java.util.NoSuchElementException: No value present”的异常信息,所以此时可以更换为orElse()方法。
范例:处理null

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		IMessage temp = MessageUtil.getMessage().orElse(new MessageImpl()); // 获取数据
		MessageUtil.useMessage(temp);
	}
}

在所有引用数据类型的操作处理之中,null 是一个重要的技术问题,所以JDK1.8后提供的这个新的类对于null的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一个程序类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值