稀土掘金 稀土掘金

Java学习十二—Java8特性之Optional类

一、简介

Java 8 引入了 Optional​ 类作为一种容器,可以用来显式地表示一个值存在或不存在。它解决了传统上可能会遇到的空指针异常问题,同时提供了一种更优雅的方式来处理可能为null的情况。

image222

Java 8 中引入 Optional​ 类的背景可以从以下几个方面来理解:

  1. 空指针异常问题: 在 Java 中,空指针异常(NullPointerException)是一个常见的问题,特别是当处理可能为null的对象时。这种异常可能会在运行时导致程序崩溃,难以调试和处理。
  2. 编程语言发展趋势: 在 Java 8 发布之前,其他一些现代编程语言(如Scala、Swift等)已经引入了类似的 Option 类型或者可空类型(Nullable Type),这些类型可以更安全和清晰地处理可能为空的值。
  3. 函数式编程的影响: Java 8 引入了函数式编程的元素,例如 lambda 表达式和流式 API。在函数式编程中,避免副作用和空值处理是重要的理念之一,因此需要一种适合函数式编程风格的空值处理机制。
  4. 更优雅的代码风格: 使用 Optional​ 类可以使代码更加清晰和优雅。通过强制显式处理可能为null的情况,可以减少条件判断和嵌套,提高代码的可读性和可维护性。
  5. API 设计的进步: 引入 Optional​ 类使得 Java 标准库的 API 设计更加完善和一致。在一些情况下,例如集合操作中的元素查找或者返回值可能为空的方法,使用 Optional​ 可以更准确地表达返回值的可能性。

综上所述,Java 8 引入 Optional​ 类旨在提供一种更加安全、清晰和优雅的方式来处理可能为null的值,以及促进函数式编程风格在 Java 中的应用。

二、类申明

public final class Optional<T> 

image

三、方法

以下是 Optional​ 类的一些常用方法:

  1. Optional.of(T value) ​ - 创建一个 Optional​ 实例,其非空值由给定的参数指定。如果给定的参数为 null​,则抛出 NullPointerException​。
  2. Optional.ofNullable(T value) ​ - 创建一个 Optional​ 实例,其值可以是 null​。如果给定的参数为 null​,则返回一个空的 Optional​ 对象。
  3. Optional.empty() ​ - 返回一个空的 Optional​ 实例。
  4. Optional.isPresent() ​ - 检查 Optional​ 是否包含非空值。如果包含非空值,则返回 true​,否则返回 false​。
  5. Optional.ifPresent(Consumer<? super T> consumer) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Consumer​ 对象。如果 Optional​ 是空的,则不执行任何操作。
  6. Optional.orElse(T other) ​ - 如果 Optional​ 包含非空值,则返回该值;否则返回提供的其他值。
  7. Optional.orElseGet(Supplier<? extends T> other) ​ - 如果 Optional​ 包含非空值,则返回该值;否则返回由 Supplier​ 调用返回的值。
  8. Optional.orElseThrow() ​ - 如果 Optional​ 包含非空值,则返回该值;否则抛出 NoSuchElementException​。
  9. Optional.map(Function<? super T,? extends U> mapper) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Function​ 对象,并返回结果包装在 Optional​ 中。如果 Optional​ 是空的,则返回空的 Optional​。
  10. Optional.flatMap(Function<? super T, Optional<? extends U>> mapper) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Function​ 对象,并返回 Function​ 返回的 Optional​。如果 Optional​ 是空的,或者 Function​ 返回空的 Optional​,则返回空的 Optional​。
  11. Optional.filter(Predicate<? super T> predicate) ​ - 如果 Optional​ 包含非空值,并且该值满足提供的 Predicate​,则返回包含该值的 Optional​。如果 Optional​ 是空的,或者非空值不满足 Predicate​,则返回空的 Optional​。

四、示例

4.1示例1

Optional<String> optional = Optional.of("bam");
​
optional.isPresent();           // true
optional.get();                 // "bam"
optional.orElse("fallback");    // "bam"optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"

4.2示例2

创建 Optional 对象:

  • of(T value) 创建一个包含指定非null值的 Optional。

    Optional<String> optional = Optional.of("Hello");
    
  • ofNullable(T value) 创建一个可能为null的 Optional 对象。

    String str = null;
    Optional<String> optional = Optional.ofNullable(str);
    
  • empty() 创建一个空的 Optional 对象。

    Optional<String> optional = Optional.empty();
    

判断值是否存在:

  • isPresent() 如果存在值,则返回true,否则返回false。

    Optional<String> optional = Optional.of("Hello");
    if (optional.isPresent()) {
        // 值存在时的操作
        System.out.println("Value is present: " + optional.get());
    } else {
        // 值不存在时的操作
        System.out.println("Value is absent.");
    }
    

获取值或默认值:

  • get() 如果存在值,则返回该值,否则抛出 NoSuchElementException​。

    Optional<String> optional = Optional.of("Hello");
    String value = optional.get();
    
  • orElse(T other) 如果存在值,则返回该值,否则返回指定的默认值。

    Optional<String> optional = Optional.ofNullable(null);
    String result = optional.orElse("Default Value");
    
  • orElseGet(Supplier<? extends T> other) 如果存在值,则返回该值,否则使用提供的 Supplier 生成一个默认值。

    Optional<String> optional = Optional.ofNullable(null);
    String result = optional.orElseGet(() -> "Default Value");
    

条件式操作:

  • filter(Predicate<? super T> predicate) 如果存在值并且满足给定条件,则返回包含该值的 Optional,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> filtered = optional.filter(s -> s.startsWith("H"));
    
  • map(Function<? super T, ? extends U> mapper) 如果存在值,则对其进行转换,并返回包含转换后值的 Optional,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> upperCase = optional.map(String::toUpperCase);
    
  • flatMap(Function<? super T, Optional<U>> mapper) 如果存在值,则对其进行转换并返回结果,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> flatMapped = optional.flatMap(s -> Optional.of(s + " World"));
    

条件式执行:

  • ifPresent(Consumer<? super T> consumer) 如果存在值,则执行指定的操作。

    Optional<String> optional = Optional.of("Hello");
    optional.ifPresent(s -> System.out.println("Value is present: " + s));
    

示例:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // 创建一个非空的 Optional
        Optional<String> optional1 = Optional.of("Hello");

        // 创建一个可能为 null 的 Optional
        String str = null;
        Optional<String> optional2 = Optional.ofNullable(str);

        // 判断值是否存在
        if (optional1.isPresent()) {
            System.out.println("Value 1 is present: " + optional1.get());
        } else {
            System.out.println("Value 1 is absent.");
        }

        // 使用 orElse 方法提供默认值
        String result = optional2.orElse("Default Value");
        System.out.println("Value 2: " + result);

        // 使用 map 对值进行转换
        Optional<String> upperCaseOptional = optional1.map(String::toUpperCase);
        upperCaseOptional.ifPresent(s -> System.out.println("Uppercase value: " + s));

        // 使用 flatMap 进行链式操作
        Optional<String> flatMapped = optional1.flatMap(s -> Optional.of(s + " World"));
        flatMapped.ifPresent(s -> System.out.println("FlatMapped value: " + s));
    }
}

image

玻璃钢生产厂家漯河城市玻璃钢雕塑曲阳玻璃钢丹顶鹤雕塑成都玻璃钢造型雕塑制作奉贤区镜面玻璃钢雕塑信息推荐仿真透明玻璃钢雕塑制作人物玻璃钢动物雕塑制作温州玻璃钢雕塑凳子烟台玻璃钢雕塑价格聊城玻璃钢商场美陈湖南花钵玻璃钢雕塑加工苏州商场美陈多少钱优质玻璃钢雕塑厂家供应东营玻璃钢仿铜雕塑定制供应陕西公园水景玻璃钢人物雕塑常州玻璃钢仿铜雕塑厂家涟源玻璃钢雕塑户外宿州特色玻璃钢雕塑销售厂家商场美陈 厦门商场美陈计法差异西藏模压玻璃钢花盆深圳户外商场美陈多少钱甘南玻璃钢雕塑公司晋江玻璃钢花盆厂家批发玻璃钢人物广场雕塑设计主题玻璃钢卡通雕塑供应商上海抽象玻璃钢雕塑广安玻璃钢雕塑摆件工程报价揭阳党建文化玻璃钢人物雕塑深圳艺术商场美陈市场报价葡萄玻璃钢雕塑现货香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化