Optional包装对象类的用法

Optional 对象是一种包装器对象,要么包装对象引用,要么null

Optional<String> optionalS = Optional.of(null); // 添加值为null时,抛出异常
Optional<String> optionalSn = Optional.ofNullable(null); // 添加值为null时,产生一个空的
Optional<String> empty = Optional.empty(); // 产生一个空的
String s = optionalSn.get(); // 获取值 
// optional为null时,设置默认值
String orElse = empty.orElse("1234"); 
String orElseGet = empty.orElseGet(()->"1234"); // orElseGet(Supplier<? extends T> other) 
// optional为null时,抛出异常
String orElseThrow = empty.orElseThrow(() -> new Exception());//orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
boolean isPresent() // 如果不为null,返回true
// void ifPresent(Consumer<? super T> consumer) // 如果不为null,执行拉姆达表达式
// Optional<String> optionalS = Optional.of("kosdf");
optionalS.ifPresent(s->System.out.println("s = " + s));
// map(Function<? super T, ? extends U> mapper)
Optional<String> u = optionalSn.map((s) -> {return s+"hello";}); // lambda返回Optianal值,如果optionalSn有值就获取
// filter(Predicate<? super T> predicate)
Optional<Object> o = optionalS.filter((s) -> {
            System.out.println("s = " + s);
            return true; // 返回true,返回当前optional值,返回false,返回空的optional值
        });
System.out.println("o = " + o);
// flatMap(Function<? super T, Optional<U>> mapper) 
Optional<Object> op = optionalS.flatMap((par) -> {
            par = "kongjks";
            return Optional.of(par); // 返回optional值
        });
System.out.println(op);
Java编程领域,对于Optional类是否鸡肋存在诸多讨论。部分观点认为使用Optional类是多此一举,若日常按常规方式使用Optional,还不如直接用`if(user != null){....}`进行判操作,给对象包装一层Optional再判断属于画蛇添足的行为[^1]。 还有观点觉得用Optional改造代码后,虽会显得优雅一些,但整体看起来仍有些奇怪。例如使用链式调用`Optional<User> optionalUser = Optional.ofNullable(user); String street = optionalUser.flatMap(u -> Optional.ofNullable(u.getLocation())).flatMap(l -> Optional.ofNullable(l.getAddress())).map(Address::getStreet).orElse("Unknown");`,代码的表现形式让人感觉不自然[^3]。 另外,从使用场景角度,专家指出可能永远不应该将Optional用于返回结果数组或结果列表的内容,而应返回数组或列表;几乎不应该将其用作某个字段或方法参数,并且经常将它作为getters的返回值被认为是过度使用,这也反映出在实际应用中Optional类存在一定的局限性,侧面体现出其被部分人认为是鸡肋的原因[^5]。 ```java import java.util.Optional; class Address { private String street; public Address(String street) { this.street = street; } public String getStreet() { return street; } } class Location { private Address address; public Location(Address address) { this.address = address; } public Address getAddress() { return address; } } class User { private Location location; public User(Location location) { this.location = location; } public Location getLocation() { return location; } } public class OptionalExample { public static void main(String[] args) { User user = null; Optional<User> optionalUser = Optional.ofNullable(user); String street = optionalUser .flatMap(u -> Optional.ofNullable(u.getLocation())) .flatMap(l -> Optional.ofNullable(l.getAddress())) .map(Address::getStreet) .orElse("Unknown"); System.out.println("Street: " + street); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值