Optional

Optional 是 Java8 提供的了 为了解决 Null 安全问题的一个 API 。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅 。

反例:

public static String getName(User u) {
    if (u == null)
        return "Unknown";
    return u.name;
}
public static String getName(User u) {
    Optional<User> user = Optional.ofNullable(u);
    if (!user.isPresent())
        return "Unknown";
    return user.get().name;
}

正确示例:

public static String getName(User u) {
    return Optional.ofNullable(u)
                    .map(user->user.name)
                    .orElse("Unknown");
}

反例:

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    if (comp != null) {
        CompResult result = comp.getResult();
        if (result != null) {
            User champion = result.getChampion();
            if (champion != null) {
                return champion.getName();
            }
        }
    }
    throw new IllegalArgumentException("The value of param comp isn't available.");

正例:

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    return Optional.ofNullable(comp)
            .map(c->c.getResult())
            .map(r->r.getChampion())
            .map(u->u.getName())
            .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}

使用例子:
1、orElse 存在即返回, 无则提供默认值

//而不是 return user.isPresent() ? user.get() : null;
return user.orElse(null);
return user.orElse(UNKNOWN_USER);

2、orElseGet 存在即返回, 无则由函数来产生

//而不要 return user.isPresent() ? user: fetchAUserFromDatabase();
return user.orElseGet(() -> fetchAUserFromDatabase());

3、ifPresent 存在才执行操作

// 正确示例
user.ifPresent(System.out::println);
 
//而不要下边那样
if (user.isPresent()) {
  System.out.println(user.get());
}

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

List<String> names = Arrays.asList("zhuxiaoming", "wangdachui", null);
for (String name : names) {
  Optional<String> upperName = Optional.ofNullable(name)
    	.map(value -> value.toUpperCase());
  // 方法调用方式
  // Optional<String> upperName = Optional.ofNullable(name).map(String::toUpperCase);
  System.out.println(upperName.orElse("No value found"));
}
        
// result
ZHUXIAOMING
WANGDACHUI
No value found

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

for (String name : names) {
  	Optional<String> optional = Optional.ofNullable(name)
    		.filter(value -> value.length() > 7);
  	System.out.println(optional.orElse("less than 7 characters"));
}
// result
zhuxiaoming
wangdachui
less than 7 characters
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值