您好,欢迎访问一九零五行业门户网

Java中的Optional常用方法有哪些

前言java中的optional是一个容器对象,它可以包含一个非空值,也可以为空。它的主要作用是在编写代码时避免空指针异常。
java 8 中optional的完整用法如下:
1. 创建optional对象可以通过of()方法创建一个包含非空值的optional对象,例如:
optional<string> optional = optional.of("value");
也可以通过ofnullable()方法创建一个包含可能为空的值的optional对象,例如:
optional<string> optional = optional.ofnullable(null);
2. 获取optional对象的值可以通过get()方法获取optional对象中的非空值,例如:
string value = optional.get();
如果optional对象中的值为空,调用get()方法会抛出nosuchelementexception异常。因此,在调用get()方法之前,最好先使用ispresent()方法判断optional对象是否包含一个非空值。
3. 判断optional对象是否包含非空值可以使用ispresent()方法判断optional对象是否包含一个非空值,例如:
if (optional.ispresent()) { // optional对象包含非空值} else { // optional对象为空}
也可以使用ifpresent()方法在optional对象包含非空值时执行一些操作,例如:
optional.ifpresent(value -> system.out.println(value));
4. 获取optional对象中的值或默认值可以使用orelse()方法获取optional对象中的值或默认值,例如:
string value = optional.orelse("default");
如果optional对象中的值为空,则返回指定的默认值。
5. 获取optional对象中的值或抛出异常可以使用orelsethrow()方法获取optional对象中的值或抛出异常,例如:
string value = optional.orelsethrow(() -> new runtimeexception("value is null"));
如果optional对象中的值为空,则抛出指定的异常。
6. 转换optional对象中的值可以使用map()方法将optional对象中的值转换为另一个类型的值,例如:
optional<integer> optional = optional.of("123").map(integer::parseint);
如果optional对象中的值为空,则返回一个空的optional对象。
7. 过滤optional对象中的值可以使用filter()方法过滤optional对象中的值,例如:
optional<string> optional = optional.of("value").filter(value -> value.startswith("v"));
如果optional对象中的值不满足指定的过滤条件,则返回一个空的optional对象。
java 9 增强我们介绍了 java 8 的特性,java 9 为 optional 类添加了三个方法:or()、ifpresentorelse() 和 stream()。
or() 方法与 orelse() 和 orelseget() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 supplier 参数产生的另一个 optional 对象。
如果对象包含值,则 lambda 表达式不会执行:
@testpublic void whenemptyoptional_thengetvaluefromor() { user result = optional.ofnullable(user) .or( () -> optional.of(new user("default","1234"))).get(); assertequals(result.getemail(), "default");}
上面的示例中,如果 user 变量是 null,它会返回一个 optional,它所包含的 user 对象,其电子邮件为 “default”。
ifpresentorelse() 方法需要两个参数:一个 consumer 和一个 runnable。如果对象包含值,会执行 consumer 的动作,否则运行 runnable。
如果你想在有值的时候执行某个动作,或者只是跟踪是否定义了某个值,那么这个方法非常有用:
optional.ofnullable(user).ifpresentorelse( u -> logger.info("user is:" + u.getemail()), () -> logger.info("user not found"));
补充:optional争议点其实到底该不该用optional,业界还是有不少争议的,一方面是optional能强迫开发者处理null值,但另一方面是optional又非常容易滥用,特别是一些开发者拿到optional之后就直接调用get()或ifpresent()方法,这样几乎没解决任何问题,还加重了编码负担。
因此,我的建议是,在你不知道该不该使用optional的场景,那就先别用。
下面是一些使用optional的场景参考,如下:
optional一般用于返回值
optional大多用于返回值,不推荐用在成员变量或方法参数中。
optional本身不判null
永远都不要给optional赋值null,也不要判断optional本身是否为null,这是因为optional本来就是解决null的,再引入null就没意思了,这应该成为业界共识。
集合不使用optional
因为集合有collections.emptylist()等更好的处理方法了,没必要再使用optional。
函数式处理值
从上面的用法介绍中就能发现,optional提供了很多lambda函数式处理的方法,如filter、map等,这些是使用optional时比较推荐使用的,因为optional能帮你自动处理null值情况,避免npe异常。
多层属性获取
前面举过这个代码样例,我觉得这是optional使用收益最明显的一个场景。
不返回null胜过返回optional
返回optional给调用方,会强制调用方处理null情况,会给调用方增加一些的编码负担,特别是复用度很高的函数。
但如果调用方大多数情况下都不期望获取到null,那应该实现一个这样的方法,要么返回值,要么异常,如下:
/** * 查询订单,要么返回订单,要么异常 */public order getorderbyidorexcept(long orderid){ order order = ordermapper.getorderbyid(orderid); if(order == null){ throw new bizexception("根据单号" + orderid + "未查询到订单!"); } return order;} /** * 查询订单,值可能为null */public optional<order> getorderbyid(long orderid){ order order = ordermapper.getorderbyid(orderid); return optional.ofnullable(order);}
由于后面处理代码依赖订单数据,获取不到订单数据,代码也没法往下走,所以在大多数情况下,选择使用getorderbyidorexcept方法更好,即避免了npe,又避免了增加编码负担!
以上就是java中的optional常用方法有哪些的详细内容。
其它类似信息

推荐信息