java基础之Java8新特性-Optional

目录

1.简介

2.Optional类常用方法

3.示例代码

4.示例代码仓库地址


1.简介

Java 8引入了一个重要的新特性,即Optional类。Optional类是为了解决空指针异常而设计的。

在Java中,当我们尝试访问一个空对象的属性或调用其方法时,很容易抛出NullPointerException。这种异常可能会导致程序崩溃或产生意外结果。

Optional类的目的是提供一种更好的处理空值的方式。它可以包含一个非空的对象,也可以表示一个空值。使用Optional类,我们可以避免直接操作空对象,从而减少NullPointerException的发生。

2.Optional类常用方法

后面的示例代码主要用到map、orElse、ifPresent方法

1.map(Function<? super T,? extends U> mapper):如果Optional对象包含一个非空的值,则将该值应用给定的函数进行转换,并返回一个新的Optional对象,用于存储转换后的结果;否则返回一个空的Optional对象。
2.ofNullable(T value):如果value不为null,则返回一个包含该value的Optional对象;否则返回一个空的Optional对象。
3.isPresent():如果Optional对象包含一个非空的值,则返回true;否则返回false。
4.get():如果Optional对象包含一个非空的值,则返回该值;否则抛出NoSuchElementException异常。
5.orElse(T other):如果Optional对象包含一个非空的值,则返回该值;否则返回other。
6.ifPresent(Consumer<? super T> consumer):如果Optional对象包含一个非空的值,则对该值执行给定的操作;否则不做任何操作。

3.示例代码

我们来看一段代码

java 复制代码
public static void main(String[] args) {

        User user=null;
        //模拟不确定的空对象
        Random random = new Random();
        if(random.nextInt(11)>5){
           user= new User("Bob");
        }
        
        //把名字转成小写
        user.setName(user.getName().toLowerCase());
        System.out.println(user.getName());

    }

在这段代码中存在潜在的空指针异常风险。如果随机数小于等于5,则 user 对象为 null,调用 user.getName() 方法会导致空指针异常。

应该在调用 getName() 方法前先进行非空判断。

我们先看传统的手动判空处理

java 复制代码
 public static void main(String[] args) {

        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }

        // 把名字转成小写
        if (user != null && user.getName() != null) {
            user.setName(user.getName().toLowerCase());
            System.out.println(user.getName());
        } else {
            System.out.println("用户对象为空或用户名为空");
        }
    }

相较于这种传统的手动判空方法我们可以使用更优雅的方法Optional

java 复制代码
  public static void main(String[] args) {
        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }

        // 使用Optional类来包装空对象
        //Lambda表达式链式处理写法
        Optional<String> optionalS1 = Optional.ofNullable(user).map(u->u.getName()).map(name->name.toLowerCase());
        // 输出结果,若空则设置默认值为MiJiu
        System.out.println(optionalS1.orElse("MiJiu"));
        //非空则输出结果
        optionalS1.ifPresent(s->System.out.println(s));

        System.out.println("--------------------------------");

        //用方法引用简化
        Optional<String> optionalS2 = Optional.ofNullable(user).map(User::getName).map(String::toLowerCase);
        System.out.println(optionalS2.orElse("MiJiu"));
        optionalS1.ifPresent(System.out::println);


    }

有关什么是Lambda表达式可以看这篇

java基础之Java8新特性-Lambda-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135395534?spm=1001.2014.3001.5502

有关什么是方法引用可以看这篇

java基础之Java8新特性-方法引入-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135469298?spm=1001.2014.3001.5502

4.示例代码仓库地址

j8-new-feature: java8新特性示例Demo (gitee.com)编辑https://gitee.com/mi9688-wine/j8-new-featurehttps://gitee.com/mi9688-wine/j8-new-feature

相关推荐
爱读源码的大都督28 分钟前
为什么有了HTTP,还需要gPRC?
java·后端·架构
Lucky_Turtle1 小时前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.1 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
ID_180079054731 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
微露清风2 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥2 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
235162 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
聪明的笨猪猪2 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.2 小时前
怎么办这是Apifox里执行http://localhost:9002/goods/getByUserName?name=“张三“为什么我改了还是500?
java·网络·网络协议·http