当前位置: 代码网 > it编程>编程语言>Java > Java中Optional的orElse操作及orElse与orElseGet的区别详解

Java中Optional的orElse操作及orElse与orElseGet的区别详解

2025年05月03日 Java 我要评论
1. 大概说明这篇文章的目的是为了说明:orelse 如何使用orelseget 如何使用两者的区别备注:orelse 可能导致 nullpointerexception,当 orelse 的参数是间

1. 大概说明

这篇文章的目的是为了说明:

  • orelse 如何使用
  • orelseget 如何使用
  • 两者的区别

备注:orelse 可能导致 nullpointerexception,当 orelse 的参数是间接计算得来的时候。虽然这种说法有点牵强(因为并不是orelse导致了空指针异常),但是使用 orelseget 确实可以避免这种情况。

2. 详细分析

2.1 .orelse 操作

先看个例子:

optional<string> optional = optional.empty();
system.out.println(optional.ispresent); // ---->输出:false
// 返回 false,表示 optional 里没有值。

解析:

  • optional.empty() 代表 一个空的 optional 实例,即 optional 没有值
  • optional.ofnullable(null) 等价于 optional.empty()

2.2 .orelse 的作用:避免空指针异常

  • 如果 optional 为空(即 optional.empty()),就返回 orelse() 里提供的默认值。
  • 如果 optional 有值,就直接返回这个值,不执行 orelse() 提供的默认值。

注意:不管 optional 为不为空,这个值都会创建,只不过为空时,才使用

// 举例:当optional为空时,orelse()才会触发
string result = optional.ofnullable(null)
    .orelse("默认值");
system.out.println(result); // ---->输出:默认值
// 再举个例子:
map<long, list<string>> map = new hashmap<>();
map.put(1l, arrays.aslist("a", "b", "c"));

list<string> result = optional.ofnullable(map.get(1l))
    .orelse(collections.emptylist()); // 为null就返回 空列表
system.out.println(result);  // ---->输出:[a, b, c] (orelse() 没起作用)

2.3 为什么要用?

list<string> result = optional.ofnullable(map.get(0l))
    .orelse(collections.emptylist())
    .stream();

如果 map.get(0l) == null,那么:

  • 不加 .orelse(collections.emptylist()) → .stream() 会报 nullpointerexception ❌
  • 加了 .orelse(collections.emptylist()) → .stream() 能正常执行 ✅

2.4 orelseget如何使用

再来看看 orelseget 中如何使用:

orelseget 作用:获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据;如果为空则返回传入的参数来创建对象。

具体的使用案例可看下图:

2.5 orelse和orelseget的区别

orelse() 和 orelseget() 都是optional 类中的方法,用于在 optional 为空时提供默认值。但它们的区别在于 默认值的获取方式

1、orelse(t other)

  • 直接传递一个默认值
  • 即使 optional里有值,也会创建 other 对象,但不会使用它
  • 适用于默认值创建代价较低的情况

2、orelseget(supplier<? extends t> supplier)

  • 传递的是一个 supplier(懒加载:只有需要的时候才会创建)接口,它是一个函数式接口,形式是这样的:()->{ return computedresult },即入参为空,有返回值(任意类型的)
  • 仅当 optional 为空时才会执行 supplier.get(),不会提前创建默认值
  • 适用于默认值创建代价较高的情况

看个例子:

class user {
    // 中文名
	private string chinesename;
	// 英文名
	private englishname englishname;
}

class englishname {
    // 全名
    private string fullname;
    // 简写
    private string shortname;
}

假如我们现在有 user 类,用户注册账号时,需要提供自己的中文名或英文名,或都提供,我们抽象出一个englishname 类,它包含英文名的全名和简写(因为有的英文名确实太长了)。现在,我们希望有一个user.getname() 方法,它可以像下面这样实现:

class user {
    // ... 之前的内容
    public string getname1() {
        return optional.ofnullable(chinesename)
                .orelse(englishname.getshortname());
    }
    
    public string getname2() {
        return optional.ofnullable(chinesename)
                .orelseget(() -> englishname.getshortname());
    }
}

写了两个版本,分别使用 orelse 和 orelseget。现在,你可以看出 getname1() 方法有什么风险了吗?它会出现空指针异常吗?----> 是的。当用户只提供了中文名时,此时 englishname 属性是 null,但是在 orelse 中,englishname.getshortname()总是会执行。而在 getname2() 中,这个风险却没有。

再举个例子:

public class test {
    public static void main(string[] args) {
        system.out.println("orelse() 的情况:");
        string result1 = optional.ofnullable("实际值")
            .orelse(test2());
        system.out.println("最终结果: " + result1);

        system.out.println("orelseget() 的情况:");
        string result2 = optional.ofnullable("实际值")
            .orelseget(() -> test2());
        system.out.println("最终结果: " + result2);
    }

    public static string test2() {
        system.out.println("执行昂贵的计算...");
        return "昂贵默认值";
    }
}

输出:

orelse() 的情况:
执行昂贵的计算...
最终结果: 实际值

orelseget() 的情况:
最终结果: 实际值

总结

到此这篇关于java中optional的orelse操作及orelse与orelseget区别详解的文章就介绍到这了,更多相关java optional的orelse操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com