java8新特性-Optional

简介: java8新特性-Optional

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.示例代码

我们来看一段代码

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() 方法前先进行非空判断。

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

 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

  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表达式可以看这篇

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

4.示例代码仓库地址

目录
相关文章
|
3月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
86 2
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
50 3
|
3月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
41 2
|
28天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
1月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
61 6
|
2月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
40 4
|
3月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
122 3
|
3月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
32 2
|
3月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
31 2
|
3月前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
45 2