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日

相关文章

  • SpringMVC上传和解析Excel方法

    下面是SpringMVC上传和解析Excel的攻略: 目录 前置条件 步骤一:添加依赖 步骤二:编写上传页面 步骤三:编写Controller接收上传文件 步骤四:编写Excel解析方法 示例一:上传并解析Excel文件 示例二:将Excel数据存储到数据库中 前置条件 在开始编写代码前,确保已经满足以下条件:- SpringMVC项目已经搭建完成。- 已经…

    Java 2023年6月15日
    00
  • 在springboot中对kafka进行读写的示例代码

    下面是关于在Spring Boot中对Kafka进行读写的完整攻略。 准备工作 在开始示例前,我们需要准备一些必要的工作: 安装Kafka并启动服务 在Spring Boot项目的pom.xml中加入Kafka依赖: <dependency> <groupId>org.springframework.kafka</groupId…

    Java 2023年5月20日
    00
  • SpringBoot快速整合SpringSecurity的详细步骤(新手都会!)

    Spring Security是一个功能强大的安全框架,可以为Spring Boot应用程序提供身份验证、授权、攻击防护等功能。本文将详细讲解如何快速整合Spring Security到Spring Boot应用程序中,包括如何配置Spring Security、如何定义用户、如何控制访问等。 配置Spring Security 在Spring Boot应用…

    Java 2023年5月15日
    00
  • 利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力

    利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力的攻略包括以下几个步骤: 1. 后端接口 首先需要在后端实现一个接口用于提供分页数据,可以使用 Linq 来实现。下面是一个 C# 的示例代码: public JsonResult GetList(int pageIndex, int pageSize) { var list = db.U…

    Java 2023年5月19日
    00
  • C#调用Java类的实现方法

    C#可以调用Java类的实现方法主要有以下三种: 使用Java Native Interface(JNI) JNI是Java所自带的一种机制,它提供了本地应用程序与Java虚拟机之间交互的能力。具体实现过程如下: 先编写Java类 将Java类编译成动态链接库 在C#中通过DllImport导入动态链接库(导入时需要显式指定Java虚拟机的路径) 调用Jav…

    Java 2023年5月19日
    00
  • springboot配置mybatis和事务管理方式

    下面是一份关于配置Spring Boot中MyBatis和事务管理的完整攻略,包含两个示例。 一、配置MyBatis和数据库 首先,需要在pom.xml文件中添加MyBatis和数据库依赖 <!– MyBatis依赖 –> <dependency> <groupId>org.mybatis.spring.boot&lt…

    Java 2023年5月20日
    00
  • 29基于java的在线考试系统设计与实现

    本章节来介绍一个基于java的在线考试系统的实现 系统概要 近年来,随着世界各国需要参加考核的人员与日俱增,单纯依靠传统的人工安排考场和监考人员的纸质化考试逐渐显示出了效率低,易发生冲突的缺陷,这时,在线考试系统便应运而生,此种考试方式以方便快捷高效等优点将越来越适用于如今的各项考试、考核。此外,无纸化在线考试对考试人员和审阅人员均提供了便捷。因此,本文将主…

    Java 2023年5月8日
    00
  • Java中JSON处理工具类使用详解

    Java中JSON处理工具类使用详解 什么是JSON JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。JSON格式常…

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