Java函数式编程(六):Optional

Java函数式编程(六):Optional

Optional简介

在Java 8中,Optional成为了一个非常重要的新特性。Optional是一个容器类型,代表一个值存在或不存在。Original Java中,我们经常返回null来表示一个空值。但是在Java 8 中使用Optional来表示一个值不存在更加明确和安全。

Optional 类(java.util.Optional)是一个容器类,代表一个值存在或不存在。原来用 null 表示一个值不存在,而现在 Optional 可以更好的描述这个概念。并且可以优雅的避免空指针的发生。

Optional如何创建

首先Optional通过四种静态工厂方法创建:

  • empty()
  • of(T value)
  • ofNullable(T value)
  • supplier(Supplier<? extends T> supplier)

下面一一示例说明:

empty():返回一个空的 Optional 实例

Optional<Car> emptyOpt = Optional.empty();

of(T value):将一个非空的值放入 Optional 容器中,如果参数是 null,就报错,否则创建一个 Optional 实例

Optional<Car> opt = Optional.of(car);

ofNullable(T value):将一个非空或空的值放到 Optional 容器中,如果为空,相当于empty()方法

Optional<Car> opt = Optional.ofNullable(car);

supplier(Supplier<? extends T> supplier):如果类中存在相应类型的值,返回相应值,否则返回由supplier定义的对象

Optional<Car> opt = Optional.ofNullable(car);
Car car2 = opt.orElseGet(() -> new Car());

Optional API

接下来我们来说明一下Optional类的API,包括获取Optional中的值、判断Optional是否存在值、滤除Optional中的值等。

get() 方法:返回所包含的值,如果内部值为 null,会抛出一个NoSuchElementException 异常

// 判断Optional是否存在值,如果有值调用get方法获取值
Optional<Car> opt = Optional.ofNullable(car);
if (opt.isPresent()) {
    Car car2 = opt.get();
}

上面的代码会判断Optional是否存在值,如果有值调用get方法获取值,如果内部值为null,会抛出一个NoSuchElementException 异常。

orElse(T other):如果有值则返回该值,否则返回向其传递的 other 参数

// 如果Optional为空,设置默认值
Car car2 = opt.orElse(new Car());

上面的代码会判断Optional是否存在值,如果不存在,会设置一个默认值。

orElseGet(Supplier<? extends T> supplier):如果有值则返回该值,否则返回由supplier生产的值

// 如果Optional为空,通过Supplier来创建一个对象实例
Car car2 = opt.orElseGet(() -> new Car());

上面的代码会判断Optional是否存在值,如果不存在,会通过一个Supplier来创建一个对象实例。

map(Function<? super T, ? extends U> mapper):如果有值,则对其进行调用,并返回一个 Optional 类型的结果,否则返回一个空 Optional

// 调用Optional值的map方法对值进行处理
Optional<String> name = opt.map(Car::getName);

上面的代码会调用Optional值的map方法对值进行处理。

filter:如果有值并且满足条件,则返回描述该值的 Optional;否则返回一个空的 Optional

// 调用Optional值的filter方法过滤值
Optional<Car> filtered = opt.filter((car) -> "polo".equals(car.getName()));

上面的代码会调用Optional值的filter方法过滤值。

Optional应用实例

下面我们举一个示例说明Optional在实际开发中的应用。

比如在某个购物网站,需要获取用户的某个订单的金额。如果用户的某个订单不存在,我们不想用null表示,而是返回一个Optional类型的空对象。

public Optional<Order> getOrderById(Integer userId, Long orderId) {
    User user = userService.getUserById(userId);
    if (user != null) {
        Order order = user.getOrderById(orderId);
        if (order != null) {
            return Optional.of(order);
        }
    }
    return Optional.empty();
}

上面的代码中,我们会判断用户和订单是否存在,如果存在就返回包装好的Optional对象,否则就返回一个空的Optional实例。

在使用方法的时候,我们可以调用Optional类的API方法来获取其中的值或者处理其中的内容。

Optional<Order> orderOpt = getOrderById(userId, orderId);

// 如果存在值,可以通过map来处理值,比如计算金额
BigDecimal total = orderOpt.map(Order::getTotal).orElse(BigDecimal.ZERO);

上面的代码中,我们首先通过getOrderById方法获取到一个Optional对象。在获取到这个Optional对象之后,我们可以通过map方法获取订单的金额,如果没有返回默认值0。这样我们便可以通过Optional对象更好的处理一些可能为null的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java函数式编程(六):Optional - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JavaScript实现九九乘法表的简单实例

    以下是“JavaScript实现九九乘法表的简单实例”的完整攻略。 展示九九乘法表 首先,在HTML文件中创建一个表格,用于展示九九乘法表: <table> <thead> <tr> <th>&times;</th> <th>1</th> <th>2&lt…

    Java 2023年6月15日
    00
  • Java8 新特性之日期时间对象及一些其他特性

    Java8 新特性之日期时间对象及一些其他特性 为什么需要新的日期时间API? 在Java 7之前,我们使用的日期时间API(java.util.Date和java.util.Calendar)存在几个问题: 非线程安全:在多线程环境下,如果多个线程同时操作日期时间对象,容易出现错误。 可变类型:java.util.Date和java.util.Calend…

    Java 2023年5月20日
    00
  • Java实现快速排序算法(Quicktsort)

    Java实现快速排序算法(Quicksort) 在本文中,将介绍如何使用Java语言实现快速排序算法。快速排序算法是一种经典的排序算法,其时间复杂度为O(nlogn),其实现方式类似于分治算法,通过选择基准值,将输入序列分为两个子序列,分别对其进行递归排序。 算法原理 快速排序算法被认为是最优秀的排序算法之一,因为它的时间复杂度为O(nlogn),它的核心思…

    Java 2023年5月19日
    00
  • java中double类型运算结果异常的解决方法

    针对“java中double类型运算结果异常的解决方法”,我给你详细讲解一下。 首先,问题的背景 在Java中,double类型是一种浮点数类型,用于存储小数,然而由于浮点数在计算机中的存储方式,会带来一些运算问题,例如: double a = 0.1; double b = 0.2; double c = a + b; System.out.println…

    Java 2023年5月27日
    00
  • springboot整合JSR303校验功能实现代码

    下面我来详细讲解“Spring Boot整合JSR303校验功能实现代码”的完整攻略。 什么是JSR303校验功能? JSR303校验功能是指一种JavaBean的校验方式,用于对JavaBean的属性进行自定义校验,从而实现对表单数据合法性的校验。它基于注解实现,注解具有可读性强、可扩展性强的特点,而且使用非常简单。 Spring Boot整合JSR303…

    Java 2023年5月20日
    00
  • Java的Spring框架的三种连接池的基本用法示例

    我会为你详细讲解Java Spring框架中三种连接池的基本用法示例。在日常开发中,我们常常需要连接数据库。连接池是一种优化数据库连接的技术,它可以大大提高性能和吞吐量。 Spring框架提供了三种连接池:Commons DBCP连接池、C3P0连接池和Tomcat连接池。下面将分别讲解它们的基本用法,包括代码示例。 Commons DBCP连接池 Comm…

    Java 2023年5月19日
    00
  • java必学必会之线程(2)

    Java必学必会之线程(2)攻略 线程同步 在多线程编程中,线程同步是一个非常重要的问题。如果不加以控制,在多线程同时访问共享资源的情况下,可能会导致数据不一致、死锁等问题。 同步的两种方式 Java 中实现同步的两种方式分别是 synchronized 和 ReentrantLock。 synchronized 关键字是 Java 提供的默认的语言级别的同…

    Java 2023年5月30日
    00
  • SpringBoot设置首页(默认页)跳转功能的实现方案

    SpringBoot设置首页(默认页)跳转功能的实现方案 在SpringBoot框架下,我们可以通过配置来设置我们网站的默认首页,让用户更加方便地访问我们的网站。在本文中,我们将讨论如何实现SpringBoot设置首页(默认页)跳转功能的实现方案。 方法一:使用Controller 可以通过编写一个控制器Controller来实现默认首页的跳转功能。具体实现…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部