设为首页 加入收藏

TOP

Java8 中的 Optional(五)
2019-09-03 01:06:06 】 浏览:72
Tags:Java8 Optional
nbsp;Optional 对象。

如果对象包含值,则 Lambda 表达式不会执行:

@Test
public 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"));

最后介绍的是新的 stream() 方法,它通过把实例转换为 Stream 对象,让你从广大的 Stream API 中受益。如果没有值,它会得到空的 Stream;有值的情况下,Stream 则会包含单一值。

我们来看一个把 Optional 处理成 Stream 的例子:

@Test
public void whenGetStream_thenOk() {     User user = new User("john@gmail.com", "1234");     List<String> emails = Optional.ofNullable(user)       .stream()       .filter(u -> u.getEmail() != null && u.getEmail().contains("@"))       .map( u -> u.getEmail())       .collect(Collectors.toList());     assertTrue(emails.size() == 1);     assertEquals(emails.get(0), user.getEmail()); }

这里对 Stream 的使用带来了其 filter()、map() 和 collect() 接口,以获取 List

 

 
 

Optional  应该怎样用?

在使用 Optional 的时候需要考虑一些事情,以决定什么时候怎样使用它。

重要的一点是 Optional 不是 Serializable。因此,它不应该用作类的字段。

如果你需要序列化的对象包含 Optional 值,Jackson 库支持把 Optional 当作普通对象。也就是说,Jackson 会把空对象看作 null,而有值的对象则把其值看作对应域的值。这个功能在 jackson-modules-java8 项目中。

 
 

它在另一种情况下也并不怎么有用,就是在将其类型用作方法或构建方法的参数时。这样做会让代码变得复杂,完全没有必要:

User user = new User("john@gmail.com", "1234", Optional.empty());

使用重载方法来处理非要的参数要容易得多。

Optional 主要用作返回类型。在获取到这个类型的实例后,如果它有值,你可以取得这个值,否则可以进行一些替代行为。

Optional 类有一个非常有用的用例,就是将其与流或其它返回 Optional 的方法结合,以构建流畅的API。

我们来看一个示例,使用 Stream 返回 Optional 对象的 findFirst() 方法:

@Test
public void whenEmptyStream_thenReturnDefaultOptional() {     List<User> users = new ArrayList<>();     User user = users.stream().findFirst().orE
首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入探究Java中hashCode()和equal.. 下一篇获取数组中元素的最大值、最小值..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目