JAVA学习-Optional.Optional与Null

本文介绍了Java8引入的Optional类,用于处理方法返回值中的null值,提供安全操作、避免空指针异常,以及其特点、使用方法、与null的比较和高级应用场景。
摘要由CSDN通过智能技术生成

'java.util.Optional'是 Java 8 引入的一个类,用于解决在方法返回值中可能出现的 'null'引用的问题。下面是关于 'Optional' 和 'null' 的概述,以及它们的特点、使用方法以及与其他概念的比较和高级应用。

1. 'null'的概述:


- 'null'是 Java 中表示引用缺失的特殊值。
- 使用 'null'可能导致空指针异常('NullPointerException')。
- 在程序中过多地使用 `null` 会降低代码的可读性和可维护性。

2. 'java.util.Optional'的概述:


- 'Optional' 是一个容器对象,它可能包含或不包含非空值。
- 'Optional'可以用来替代 'null'值的返回。
- 'Optional'提供了丰富的 API,可以安全地进行值的操作,避免了空指针异常。
- 'Optional'提供了方法来判断是否存在值、获取值、如果值不存在则执行某些操作等。

3. 特点:


- 'Optional'是不可变的,一旦创建就不能修改其内部状态。
- 它可以容纳任何类型的对象,包括 'null'。

4.使用方法:


- 创建 'Optional':使用 'Optional.of()'、'Optional.ofNullable()'或 'Optional.empty()'。
- 检查值是否存在:使用 'isPresent()'方法。
- 获取值:使用 'get()'方法(在确定值存在时使用)。
- 获取值或默认值:使用 'orElse()'、'orElseGet()'或 'orElseThrow()'方法。
- 安全地处理值:使用 'ifPresent()'、'ifPresentOrElse()'或 'map()'方法。

5.与 'null'比较:


- 'Optional'提供了更安全、更易读的方式来处理可能缺失的值,而不是直接使用 'null'。
- 使用 'Optional' 可以清晰地表达出某个值是可选的,而 'null'则隐藏了这种信息。

6.高级应用:


- 使用 'flatMap()'方法可以在链式调用中处理 'Optional'。
- 可以结合 'Stream'API 使用 'Optional'。
- 自定义 'Supplier'和 'Consumer',结合 'Optional'使用可以实现更灵活的操作。

下面是一个简单的示例代码,演示了如何使用 'Optional':

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        String str = "Hello";
        Optional<String> optional = Optional.ofNullable(str);

        // 检查值是否存在
        if (optional.isPresent()) {
            System.out.println("Value is present: " + optional.get());
        } else {
            System.out.println("Value is absent");
        }

        // 获取值或默认值
        String result = optional.orElse("Default Value");
        System.out.println("Result: " + result);

        // 安全地处理值
        optional.ifPresent(value -> System.out.println("Value: " + value));

        // 使用 map 转换值
        Optional<Integer> lengthOptional = optional.map(String::length);
        lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
    }
}

       这个示例展示了 'Optional' 的基本用法,包括创建、检查是否存在、获取值、获取值或默认值、安全地处理值以及使用 'map'转换值。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
java.lang.IllegalStateException: Optional int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleNullValue(AbstractNamedValueMethodArgumentResolver.java:263) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:116) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.24.jar:5.3.24]
07-23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值