都快出JDK21了,你还不会用Optional?

2023-09-06 08:22:32 浏览数 (1)

前言

同事最近老是跟了不起抱怨,在搬砖打代码的时候经常遇到空指针异常。了不起立马给他安利了一个Java中的神器:Optional,它是一种容器对象,可以包含或不包含非空值。Optional就像是一个守护神,它可以包装你的值,保护你的代码免受空指针的困扰。你再也不用为了判断是否为 null 而头疼了!让我们一起领略 Optional 的魅力,并通过代码示例深入理解。

包装与揭示

如何创建一个 Optional 对象?想象一下,你正在寻找宝藏。Optional.of() 就是你找到宝藏的钥匙,而 empty() 则是告诉你这次没有宝藏。记住,不必再把 null 当宝藏了!

代码语言:javascript复制
Optional<String> treasureKey = Optional.of("Golden Key");
Optional<String> noTreasure = Optional.empty();

获取宝藏

如何从 Optional 中获取宝藏?使用 get() 方法来获取宝藏。但要小心,如果值为 null,会抛出 NoSuchElementException 异常。

代码语言:javascript复制
String realName = treasureKey.get(); // 潜在风险,需要确保值不为 null

优雅地获取宝藏

如何从 Optional 中取出宝藏?这次你不再需要陷入陷阱中!使用 orElse(),如果宝藏不存在,就有一个备用宝藏。你可以得到宝藏,不必抛异常!

代码语言:javascript复制
Optional<String> maybeTreasure = Optional.of("Shiny Gem");
String treasure = maybeTreasure.orElse("Ordinary Rock");
System.out.println("You found: "   treasure); // 输出:You found: Shiny Gem

自定义宝藏寻找

是否可以有更有趣的方式找到宝藏?当然可以!使用 orElseGet(),你可以告诉宝藏守护神:如果没有宝藏,我要自己动手!这样,你可以通过代码创造奇迹!

代码语言:javascript复制
Optional<String> maybeTreasure = Optional.empty();
String craftedTreasure = maybeTreasure.orElseGet(() -> {
    String crafted = "Crafted Gem";
    // 在这里添加你的制作宝藏的代码逻辑
    return crafted;
});
System.out.println("You created: "   craftedTreasure); // 输出:You created: Crafted Gem

串联宝藏的力量

如何在宝藏中继续探索?使用 map(),你可以在宝藏上施展魔法,变换它的价值。而 flatMap() 则可以帮你打开套娃,揭示嵌套的宝藏!

代码语言:javascript复制
Optional<String> originalTreasure = Optional.of("Plain Chest");
Optional<String> upgradedTreasure = originalTreasure.map(treasure -> "Shiny "   treasure);
System.out.println("Upgraded: "   upgradedTreasure.orElse("Nothing")); // 输出:Upgraded: Shiny Plain Chest

Optional<Optional<String>> nestedTreasure = Optional.of(Optional.of("Nested Gem"));
Optional<String> revealedTreasure = nestedTreasure.flatMap(opt -> opt); // 使用 flatMap 展开嵌套 Optional
System.out.println("Revealed: "   revealedTreasure.orElse("Empty Nest")); // 输出:Revealed: Nested Gem

总结

通过以上的场景,你已经领略了 Java 中 Optional 的妙用。它就像是编程世界中的魔法药水,帮助你避免空指针异常的麻烦,让你的代码更加精彩、更加安全!Optional提供了丰富的方法来满足不同场景的需求。然而,过度使用Optional也可能导致代码变得复杂,因此在使用时需要权衡利弊。

0 人点赞