【Java新特性揭秘】Optional类,告别NullPointerException的神器!

Java 8引入了Optional类,这是一个可以包含或不包含非空值的容器对象。它主要用于避免显式的null检查,从而减少空指针异常(NullPointerException)的发生。

创建Optional对象

  1. 使用Optional.of(): 如果确定值不为null,可以使用此方法。如果传入null,会抛出NullPointerException

    Optional<String> optional = Optional.of("Hello");
    
  2. 使用Optional.ofNullable(): 允许传入null值。如果值为null,则创建一个空的Optional对象。

    Optional<String> optional = Optional.ofNullable(null);
    
  3. 使用Optional.empty(): 创建一个空的Optional对象。

    Optional<String> optional = Optional.empty();
    

访问Optional中的值

  1. 使用isPresent()get(): isPresent()用于检查是否有值,get()用于获取值。注意,直接调用get()在没有值的情况下会抛出NoSuchElementException

    if (optional.isPresent()) {
        System.out.println(optional.get());
    }
    
  2. 使用ifPresent(): 如果值存在,执行给定的操作。

    optional.ifPresent(value -> System.out.println(value));
    
  3. 使用orElse()orElseGet(): 如果值存在,返回该值;否则,返回默认值。orElseGet()接受一个Supplier接口,只有在需要时才会计算默认值。

    String value = optional.orElse("Default Value");
    String value2 = optional.orElseGet(() -> "Computed Default Value");
    
  4. 使用orElseThrow(): 如果值存在,返回该值;否则,抛出由指定的Supplier生成的异常。

    String value = optional.orElseThrow(() -> new IllegalStateException("Value is not present"));
    

转换Optional中的值

  1. 使用map(): 如果值存在,应用提供的函数并返回一个新的Optional对象。

    Optional<Integer> length = optional.map(String::length);
    
  2. 使用flatMap(): 类似于map(),但要求返回值必须是Optional类型。

    Optional<Integer> length = optional.flatMap(value -> Optional.of(value.length()));
    

过滤Optional中的值

  1. 使用filter(): 如果值存在并且满足提供的谓词条件,返回包含该值的Optional对象;否则,返回一个空的Optional对象。
    Optional<String> filtered = optional.filter(value -> value.startsWith("H"));
    

示例代码

下面是一个综合示例,展示了如何使用Optional类:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // 创建一个包含非空值的Optional对象
        Optional<String> optional = Optional.of("Hello, World!");
        
        // 检查值是否存在
        if (optional.isPresent()) {
            System.out.println("Value is present: " + optional.get());
        } else {
            System.out.println("Value is not present");
        }
        
        // 使用ifPresent()方法
        optional.ifPresent(value -> System.out.println("Value using ifPresent: " + value));
        
        // 使用orElse()方法
        String defaultValue = optional.orElse("Default Value");
        System.out.println("Value using orElse: " + defaultValue);
        
        // 使用orElseGet()方法
        String computedValue = optional.orElseGet(() -> "Computed Default Value");
        System.out.println("Value using orElseGet: " + computedValue);
        
        // 使用orElseThrow()方法
        try {
            String value = optional.orElseThrow(() -> new IllegalStateException("Value is not present"));
            System.out.println("Value using orElseThrow: " + value);
        } catch (IllegalStateException e) {
            System.out.println(e.getMessage());
        }
        
        // 使用map()方法
        Optional<Integer> length = optional.map(String::length);
        length.ifPresent(len -> System.out.println("Length of the string: " + len));
        
        // 使用flatMap()方法
        Optional<Integer> flatMappedLength = optional.flatMap(value -> Optional.of(value.length()));
        flatMappedLength.ifPresent(len -> System.out.println("Flat mapped length: " + len));
        
        // 使用filter()方法
        Optional<String> filtered = optional.filter(value -> value.contains("World"));
        filtered.ifPresent(val -> System.out.println("Filtered value: " + val));
    }
}
输出:
Value is present: Hello, World!
Value using ifPresent: Hello, World!
Value using orElse: Hello, World!
Value using orElseGet: Hello, World!
Value using orElseThrow: Hello, World!
Length of the string: 13
Flat mapped length: 13
Filtered value: Hello, World!

通过这些方法,你可以更优雅地处理可能为null的值,减少空指针异常的风险,提高代码的可读性和健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值