设为首页 加入收藏

TOP

Java8 中的 Optional(四)
2019-09-03 01:06:06 】 浏览:75
Tags:Java8 Optional
sp;   String position = Optional.ofNullable(user)       .flatMap(u -> u.getPosition()).orElse("default");     assertEquals(position, user.getPosition().get()); }


过滤值

除了转换值之外,Optional  类也提供了按条件“过滤”值的方法。

filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional

来看一个根据基本的电子邮箱验证来决定接受或拒绝 User(用户) 的示例:

@Test
public void whenFilter_thenOk() {     User user = new User("anna@gmail.com", "1234");     Optional<User> result = Optional.ofNullable(user)       .filter(u -> u.getEmail() != null && u.getEmail().contains("@"));     assertTrue(result.isPresent()); }

如果通过过滤器测试,result 对象会包含非空值。

Optional 类的链式方法

为了更充分的使用 Optional,你可以链接组合其大部分方法,因为它们都返回相同类似的对象。

我们使用 Optional  重写最早介绍的示例。

首先,重构类,使其 getter 方法返回 Optional 引用:

public class User {     private Address address;     public Optional<Address> getAddress() {         return Optional.ofNullable(address);     }     // ... } public class Address {     private Country country;     public Optional<Country> getCountry() {         return Optional.ofNullable(country);     }     // ... }

上面的嵌套结构可以用下面的图来表示:

optional nested

现在可以删除 null 检查,替换为 Optional 的方法:

@Test
public void whenChaining_thenOk() {     User user = new User("anna@gmail.com", "1234");     String result = Optional.ofNullable(user)       .flatMap(u -> u.getAddress())       .flatMap(a -> a.getCountry())       .map(c -> c.getIsocode())       .orElse("default");     assertEquals(result, "default"); }

上面的代码可以通过方法引用进一步缩减:

String result = Optional.ofNullable(user)
  .flatMap(User::getAddress)
  .flatMap(Address::getCountry)
  .map(Country::getIsocode)
  .orElse("default");

    结果现在的代码看起来比之前采用条件分支的冗长代码简洁多了。

 



Java 9 增强

我们介绍了 Java 8 的特性,Java 9 为 Optional 类添加了三个方法:or()ifPresentOrElse() 和 stream()

or() 方法与 orElse() 和 orElseGet() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 Supplier 参数产生的另一个&

首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入探究Java中hashCode()和equal.. 下一篇获取数组中元素的最大值、最小值..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目