Java8 的 Optional(废)

Optional

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

of

根据传入的值生成Optional对象
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。

User u1 = new User();
User u2 = new User();
u2.setName("张三");
User u3 = null;
Optional<User> user1 = Optional.of(u1);
Optional<User> user2 = Optional.of(u2);
// 打印空user对象的name值
user1.ifPresent(user -> {
    System.out.println("user.getName()");
});
// 打印name = 张三的user对象的name值
user2.ifPresent(user -> {
    System.out.println("user.getName()");
});
// NullPointerException
Optional<User> user3 = Optional.of(u3);

ofNullable

根据传入的值生成Optional对象

如果指定的值为null,则返回一个空的Optional。

User u1 = new User();
User u2 = new User();
u2.setName("张三");
User u3 = null;
Optional<User> user1 = Optional.ofNullable(u1);
Optional<User> user2 = Optional.ofNullable(u2);
Optional<User> user3 = Optional.ofNullable(u3);
// 打印空user对象的name值
user1.ifPresent(user -> {
    System.out.println(user.getName());
});
// 打印name = 张三的user对象的name值
user2.ifPresent(user -> {
    System.out.println(user.getName());
});
// 打印empty
log.info("user3:" + user3.toString());

get

如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException

User u2 = new User();
u2.setName("张三");
User u3 = null;
User user2 = Optional.ofNullable(u2).get();
// 打印name = 张三的user对象
log.info("user2:" + user2);
// NoSuchElementException
User user3 = Optional.ofNullable(u3).get();
log.info("user3:" + user3);
 

isPresent

如果有值返回true,如果为null返回false。

User u2 = new User();
u2.setName("张三");
User u3 = null;
boolean booleanUser2 = Optional.ofNullable(u2).isPresent();
boolean booleanUser3 = Optional.ofNullable(u3).isPresent();
// true
log.info("booleanUser2:" + booleanUser2);
// false
log.info("booleanUser3:" + booleanUser3);

ifPrensent

该方法也可以检测是否为null,同时该方法还可以接受一个Consumer参数。

User u2 = new User();
u2.setName("张三");
Optional.ofNullable(u2).ifPresent(user -> user.setAge(21));
// 21
log.info("u2:" + u2.getAge());

 orElse

如果有值则将其返回,否则返回指定的其它值。

User u2 = new User();
u2.setName("张三");
User u3 = null;
User user = Optional.ofNullable(u3).orElse(u2);
// 打印u2对象
log.info("user:" + user.toString());

orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。

User u2 = new User();
u2.setName("张三");
User u3 = null;
User user1 = Optional.ofNullable(u3).orElseGet(() -> new User());
User user2 = Optional.ofNullable(u3).orElseGet(() -> u2);
// 打印User空对象
log.info("user1:" + user1.toString());
// u2对象
log.info("user2:" + user2.toString());

备注:orElse和orElseGet区别:当user对象不为null时,orElse能创建User对象,而orElseGet方法不创建User对象。

orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

User u1 = null;
User u2 = new User();
u2.setName("张三");
User user2 = Optional.ofNullable(u2).orElseThrow(() -> new IllegalStateException());
// 打印u2对象
log.info("user2:" + user2.toString());
// IllegalStateException
User user1 = Optional.ofNullable(u1).orElseThrow(() -> new IllegalStateException());

map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。

User u1 = new User();
u1.setName("张三");
User u2 = new User();
u2.setName("李四");
u2.setEmail("lisi@163.com");
Optional<String> s = Optional.ofNullable(u1).map(user -> user.getEmail());
String email1 = s.orElse("zhangsan@sina.com");
// zhangsan@sina.com
log.info("email1:" + email1);
String email2 = Optional.ofNullable(u2).map(user -> user.getEmail()).orElse("lisi@hotmail.com");
// lisi@163.com
log.info("email2:" + email2);

flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。

User u1 = new User();
u1.setName("张三");
String name = Optional.ofNullable(u1).flatMap(user -> user.getName()).orElse("zhangsan");
// 张三
log.info("name:" + name);

filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

User user = new User();
user.setName("张三");
user.setAge(11);
User user1 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 11).orElseThrow(() -> new NullPointerException());
// user对象
log.info("user1:" + user1);
// NullPointerException
User user2 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 22).orElseThrow(() -> new NullPointerException());
log.info("user2:" + user2);

综合应用

CustomListResult customListResult = customListParamMapper.getCustomListByMenuName(customListParam);
Optional.ofNullable(customListResult).ifPresent(result -> {
    result.setMenus(JSON.parseArray(customListResult.getMenuArr()));
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mephisto180502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值