• 【java8】Optional的使用


    Java8在java.util包中添加了一个新的类Optional。

    Optional类是一个容器,用于表示可能包含也可能不包含非null值。

    Optional类提供了许多方法用于处理可用不可用,而不是简单的检查空值情况。

    java.util.Optional类的声明如下

    public final class Optional<T> extends Object
    
    • 1

    注意:该类是一个最终类,不能被继承和扩展。

    创建Optional对象

    Optional类提供了三个静态方法用于创建Optional类的实例,这三个方法的返回值都是Optional。

    方法说明
    empty()创建一个空的Optional类的实例
    of(T value)创建一个包含了指定T类型的value值的Optional实例
    ofNullable(T value)如果value非null,则创建一个包含了指定T类型的value值的Optional实例,否则创建一个空的Optional实例

    Optional创建对象的使用:

    Dish dish = new Dish("pork", false, 800, Dish.Type.MEAT);
    
    // 声明一个空的Optional
    Optional<Dish> dish1 = Optional.empty();
    
    // 依据一个非空值创建Optional,dish是一个null,这段代码会立即抛出一个NullPointerException,而不会等到使用时再报错
    Optional<Dish> dish2 = Optional.of(dish);
    
    // 可接受null的Optional
    Optional<Dish> dish3 = Optional.ofNullable(dish);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Optional类提供的方法

    方法说明
    Optional filter(Predicate predicate)如果存在值,并且值与给定谓词匹配,则返回描述值的Optional,否则返回空Optional
    Optional flatMap(Function mapper)如果值存在,则将flatMap应用到该值上并返回应用后的结果,如果值不存在,则返回一个空的Optional
    T get()如果此Optional中存在值,则返回该值,否则抛出NoSuchElementException 异常
    void ifPresent(Consumer consumer)如果值存在,则使用该值作为参数调用方法consumer。如果值不存在,则什么事情都不做
    boolean isPresent()如果值存在则返回true ,否则返回false
    Optional map(Function mapper)如果存在值,则将传递的map函数应用于该值,如果结果为非null,则返回描述结果的Optionals
    T orElse(T other)如果值存在则返回值,否则返回other
    T orElseGet(Supplier other)如果值存在则返回值,否则调用other并返回该调用的结果
    T orElseThrow(Supplier exceptionSupplier)如果值存在,则返回包含的值,否则抛出由开发者提供的异常

    Optional的使用:

    Optional<Dish> dish4 = Optional.of(dish).filter(Dish::isVegetarian);
    dish4.ifPresent(System.out::println);
    
    Dish dish5 = Optional.of(dish).get();
    System.out.println(dish5);
    
    boolean present = Optional.of(dish).isPresent();
    System.out.println(present);
    
    Dish dish6 = null;
    dish6  = Optional.ofNullable(dish6).orElse(dish);
    System.out.println(dish6);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    map与flatMap

    package com.morris.java8.optional;
    
    import java.util.Optional;
    
    public class OptionalExample {
    
        public static void main(String[] args) {
    
            Insurance insurance = new Insurance();
            insurance.setName("morris");
    
            Car car = new Car();
            car.setInsurance(Optional.ofNullable(insurance));
    
            Person person = new Person();
            person.setCar(Optional.ofNullable(car));
    
            // 使用map从Optional对象中提取和转换值
            Optional.of(insurance).map(Insurance::getName).ifPresent(System.out::println);
    
            // 使用flatMap链接Optional对象
            String carInsuranceName = getCarInsuranceName(Optional.ofNullable(person));
            System.out.println(carInsuranceName);
    
        }
    
        public static String getCarInsuranceName(Optional<Person> person) {
            return person.flatMap(Person::getCar)
                    .flatMap(Car::getInsurance)
                    .map(Insurance::getName)
                    .orElse("Unknown");
        }
    
        static class Person {
            private Optional<Car> car;
            public Optional<Car> getCar() { return car; }
    
            public void setCar(Optional<Car> car) {
                this.car = car;
            }
        }
        static class Car {
            private Optional<Insurance> insurance;
            public Optional<Insurance> getInsurance() { return insurance; }
    
            public void setInsurance(Optional<Insurance> insurance) {
                this.insurance = insurance;
            }
        }
        static class Insurance {
            private String name;
            public String getName() { return name; }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    rust_for_linux驱动完整版记录
    Windows11 配置Cuda cuDNN Pytorch环境
    基于springboot的疫情防控管理系统
    Linux驱动开发——(六)按键中断实验
    C# 获取Json对象中指定属性的值
    Docker基础:Docker可视化面板portainer介绍
    DB2 常用命令及SQL语句
    Spring监听器
    LINUX进程如何管理控制(二)
    Vue3 —— 常用 Composition API(一)(computed函数、watch函数、watchEffect函数、生命周期钩子)
  • 原文地址:https://blog.csdn.net/u022812849/article/details/125467927