Java8之Optional类的基本使用

一、简介

  • Optional是一个容器对象,它可能包含某个值,也可能不包含。
  • 它的设计目的是为了解决空指针异常问题。
  • 使用Optional可以避免在代码中显式地检查null值,从而使代码更加简洁和可读。

二、常见的Optional用法:

1、创建Optional对象:

1.1 使用of()方法:

创建一个包含指定非null值的Optional对象。

下面是一个使用of()方法创建Optional对象的示例:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        String value = "Hello World!";
        Optional<String> optional = Optional.of(value);

        // 检查Optional是否包含值
        if (optional.isPresent()) {
    
    
            System.out.println("Optional包含值: " + optional.get());
        } else {
    
    
            System.out.println("Optional为空");
        }
    }
}

在这个示例中,我们使用of()方法创建了一个包含非null值的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。

输出结果为:

Optional包含值: Hello World!

注意:使用of()方法时,如果传入的值为null,会立即抛出NullPointerException异常。因此,在使用of()方法创建Optional对象时,需要确保传入的值不为空。如果值可能为空,可以使用ofNullable()方法创建Optional对象,该方法可以接受null值。

1.2 使用ofNullable()方法:

创建一个包含指定值的Optional对象,如果值为null,则创建一个空的Optional对象。

下面是一个使用ofNullable()方法创建Optional对象的示例:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        String value = null;
        Optional<String> optional = Optional.ofNullable(value);

        // 检查Optional是否包含值
        if (optional.isPresent()) {
    
    
            System.out.println("Optional包含值: " + optional.get());
        } else {
    
    
            System.out.println("Optional为空");
        }
    }
}

在这个示例中,我们使用ofNullable()方法创建了一个包含指定值的Optional对象。如果值为null,则创建一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。

输出结果为:

Optional为空

注意:使用ofNullable()方法创建的Optional对象可以接受null值,不会立即抛出NullPointerException异常。这样可以更灵活地处理可能为空的值。

1.3 使用empty()方法:

创建一个空的Optional对象。

下面是一个使用empty()方法创建空的Optional对象的示例:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.empty();

        // 检查Optional是否包含值
        if (optional.isPresent()) {
    
    
            System.out.println("Optional包含值: " + optional.get());
        } else {
    
    
            System.out.println("Optional为空");
        }
    }
}

在这个示例中,我们使用empty()方法创建了一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。由于我们使用empty()方法创建的Optional对象是空的,所以isPresent()返回值为false,程序会打印输出Optional为空。

输出结果为:

Optional为空

使用empty()方法创建的Optional对象始终是空的,不包含任何值。这在某些情况下可以用于表示缺失值。

2、判断Optional是否包含值:

2.1 使用isPresent()方法:

如果Optional对象包含值,则返回true,否则返回false。

3、获取Optional中的值:

3.1 使用get()方法:

如果Optional对象包含值,则返回该值,否则抛出NoSuchElementException异常。

下面是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.of("Hello World");

        try {
    
    
            String value = optional.get();
            System.out.println("Optional的值: " + value);
        } catch (NoSuchElementException e) {
    
    
            System.out.println("Optional为空");
        }
    }
}

在这个示例中,我们使用of()方法创建一个非空的Optional对象,并将字符串"Hello World"作为值传递给它。然后,我们使用get()方法获取Optional对象的值,并进行相应的操作。

输出结果为:

Optional的值: Hello World

如果我们将Optional对象设为空:

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

则optional.get()会抛出NoSuchElementException异常,因为Optional对象为空。

请注意,使用get()方法时,一定要先使用isPresent()方法来检查Optional对象是否包含值,以避免抛出异常。

3.2 使用orElse()方法:

如果Optional对象包含值,则返回该值,否则返回指定的默认值。

以下是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.of("Hello World");
        
        String value = optional.orElse("Default Value");

        System.out.println("Optional的值: " + value);
    }
}

在这个示例中,我们使用of()方法创建一个非空的Optional对象,并将字符串"Hello World"作为值传递给它。然后,我们使用orElse()方法获取Optional对象的值,如果Optional对象为空,则返回指定的默认值"Default Value"。

输出结果为:

Optional的值: Hello World

如果我们将Optional对象设为空:

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

则optional.orElse(“Default Value”)会返回指定的默认值"Default Value",因为Optional对象为空。

使用orElse()方法时,可以避免抛出异常,并且可以提供一个默认值来处理Optional对象为空的情况。

3.3 使用orElseGet()方法:

如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来生成一个默认值。

以下是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.empty();
        
        String value = optional.orElseGet(() -> generateDefaultValue());

        System.out.println("Optional的值: " + value);
    }
    
    public static String generateDefaultValue() {
    
    
        System.out.println("生成默认值");
        return "Default Value";
    }
}

在这个示例中,我们使用empty()方法创建一个空的Optional对象。然后,我们使用orElseGet()方法获取Optional对象的值,如果Optional对象为空,则通过调用generateDefaultValue()方法生成一个默认值。

generateDefaultValue()方法是一个自定义的方法,用于生成默认值。在这个示例中,我们简单地打印一条消息 “生成默认值”,然后返回默认值 “Default Value”。

输出结果为:

生成默认值
Optional的值: Default Value

由于Optional对象为空,因此会调用generateDefaultValue()方法生成默认值。

使用orElseGet()方法时,可以通过Supplier接口提供更灵活的方式来生成默认值,例如使用lambda表达式或方法引用。这使得我们可以根据需要动态生成默认值。

3.4 使用orElseThrow()方法:

如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来抛出指定的异常。

以下是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.empty();
        
        try {
    
    
            String value = optional.orElseThrow(() -> new IllegalArgumentException("值为空"));
            System.out.println("Optional的值: " + value);
        } catch (IllegalArgumentException e) {
    
    
            System.out.println("捕获到异常: " + e.getMessage());
        }
    }
}

在这个示例中,我们使用empty()方法创建一个空的Optional对象。然后,我们使用orElseThrow()方法获取Optional对象的值,如果Optional对象为空,则通过调用Supplier接口提供的方法来抛出指定的异常。

在这个示例中,我们使用lambda表达式() -> new IllegalArgumentException(“值为空”)作为Supplier接口的实现,当Optional对象为空时,会抛出IllegalArgumentException异常,并指定异常的消息为 “值为空”。

输出结果为:

捕获到异常: 值为空

由于Optional对象为空,因此会抛出IllegalArgumentException异常,并打印异常的消息。

使用orElseThrow()方法时,可以通过Supplier接口提供更灵活的方式来抛出异常,例如使用lambda表达式或方法引用。这使得我们可以根据需要动态地抛出不同的异常。

4、转换Optional中的值:

4.1 使用map()方法:

对Optional中的值进行转换,并返回一个新的Optional对象。

以下是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.of("Hello");
        
        Optional<String> result = optional.map(value -> value + " World");
        System.out.println("转换后的Optional的值: " + result.orElse(""));
    }
}

在这个示例中,我们使用of()方法创建一个包含值为"Hello"的Optional对象。然后,我们使用map()方法对值进行转换,将其与" World"拼接起来。最后,我们使用orElse()方法获取转换后的值,如果转换后的Optional对象为空,则返回一个空字符串。

输出结果为:

转换后的Optional的值: Hello World

由于Optional对象包含值,因此map()方法会将值与" World"拼接起来,并返回一个新的Optional对象。最后,我们通过orElse()方法获取转换后的值,并打印到控制台。

使用map()方法可以方便地对Optional对象的值进行转换,而不需要进行额外的空值检查。这使得代码更加简洁和易读。

4.2 使用flatMap()方法:

对Optional中的值进行转换,并返回一个新的Optional对象。

以下是一个示例代码:

import java.util.Optional;

public class OptionalDemo {
    
    
    public static void main(String[] args) {
    
    
        Optional<String> optional = Optional.of("Hello");
        
        Optional<String> result = optional.flatMap(value -> Optional.of(value + " World"));
        System.out.println("转换后的Optional的值: " + result.orElse(""));
    }
}

在这个示例中,我们使用of()方法创建一个包含值为"Hello"的Optional对象。然后,我们使用flatMap()方法对值进行转换,将其与" World"拼接起来,并使用of()方法将结果包装成一个新的Optional对象。最后,我们使用orElse()方法获取转换后的值,如果转换后的Optional对象为空,则返回一个空字符串。

输出结果为:

转换后的Optional的值: Hello World

由于Optional对象包含值,因此flatMap()方法会将值与" World"拼接起来,并返回一个新的Optional对象。最后,我们通过orElse()方法获取转换后的值,并打印到控制台。

使用flatMap()方法可以方便地对Optional对象的值进行转换,并且可以链式调用多个转换操作。这使得代码更加灵活和易读。

猜你喜欢

转载自blog.csdn.net/qq_39939541/article/details/132308574