深入了解Java 8 新特性:Optional类的实践应用

news2024/9/22 5:25:26

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概15000多字,预计阅读时间长需10分钟。
  2. 本篇文章的兼具实战性、理论性,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

关于Optional类

        Java 8中的Optional类是一个容器类,用于解决null值引发的问题,并提供了一种更安全的方式来处理值可能为null的情况。

        Optional类的主要目的是为了解决空指针异常(NullPointerException)的问题。在Java中,使用null值是一种常见的做法,但是这可能会导致运行时异常,特别是在进行对象引用的操作时。Optional类提供了一种方式来更明确地处理可能为null的值,从而避免出现NullPointerException。

        Optional类提供了一些方法来检查值是否存在以及获取值。例如,isPresent()方法用于检查值是否存在,get()方法用于获取值,orElse()方法用于提供一个默认值,orElseGet()方法用于提供一个生成值的表达式,orElseThrow()方法用于提供一个异常。

        使用Optional类可以使得代码更加简洁、安全和易于理解。通过使用Optional类,开发者可以明确地表明值可能为null,并且可以提供适当的处理方式。这有助于减少运行时异常,提高代码的可靠性和可维护性。

        作为java8新增特性中一个非常重要的内容,Optional类当然不同凡响,其特点必须是鲜明的,且往下看:

  1. 类型安全的容器类:Optional类是一个容器类,可以保存类型化的值。它提供了类型安全的解决方案,以避免使用null值。
  2. 减少NullPointerException:使用Optional类可以避免在代码中出现NullPointerException。它提供了一种明确的方式来处理可能为null的值,从而避免了运行时异常。
  3. 链式调用:Optional类支持链式调用,可以在一行代码中执行多个操作。这种简洁的语法使得代码更加易读和易于理解。
  4. 可选的方法链:Optional类提供了一系列可选的方法,例如isPresent()、get()、orElse()、orElseGet()、orElseThrow()等。这些方法可以根据需要选择使用,以满足不同的场景需求。
  5. 函数式编程风格:Optional类是Java 8引入函数式编程风格的体现之一。它提供了流式编程的支持,可以与其他函数式编程风格的方法(如Stream)一起使用,实现更灵活和高效的代码编写。

        总之,Java 8的Optional类是一个非常有用的工具,它提供了更安全、更灵活和更简洁的方式来处理可能为null的值。

Optional的核心方法

        掌握其核心方法的使用,其实也没有什么窍门,就是逐一击破。下面将逐一给小伙伴一一展示每一个方法的功能作用和使用方法,建议先行关注和收藏,以便后续想用时随时可以找到。

Optional#empty()

        Optional.empty()是Optional类的一个静态方法,用于返回一个空的Optional对象。这个方法的主要功能作用是提供一个默认的Optional对象,当需要使用Optional但实际没有值可供包装时,就可以使用Optional.empty()来代替。

        使用场景:

  1. 当你期望返回一个Optional对象,但实际上没有值可以返回时,可以使用Optional.empty()
  2. 在使用Optional对象进行链式调用时,如果某个链式调用的结果为null,可以使用Optional.empty()

使用示例:

@Test
public void test() {
    List list=new ArrayList();
    Optional<String> optional = Optional.of(list).empty();
    if (!optional.isPresent()) {
        System.out.println("Optional is empty");
    } else {
        System.out.println("Optional is not empty, value = " + optional.get());
    }
}

        在这个示例中,我们创建了一个空的Optional对象,并使用isPresent()方法检查它是否包含一个值。由于Optional是空的,所以isPresent()方法返回false,打印出"Optional is empty"。如果我们试图使用get()方法获取值,会抛出NoSuchElementException异常。

Optional#of()和Optional#ofNullable()

        Optional#of()和 Optional.ofNullable()是 Java 8 中 Optional 类的一个静态工厂方法,它的功能作用是创建一个包含指定值的 Optional 对象。如果该值不为 null,则返回一个包含该值的 Optional 对象;如果该值为 null,则这里需要特别注意一下:Optional.of()要求接收的参数必须不能为null,否则会抛出空指针异常;而Optional.ofNullable()可以接受一个为null的参数;

        使用场景:

  • 当需要使用一个可能为 null 的值时,可以使用 Optional#ofNullable() ;
  • 在需要返回一个 Optional 对象作为函数或方法的结果时,可以使用 Optional#of() 或ofNullable;
  • 在需要使用 Optional 对象进行链式调用时,可以使用 Optional#of() 或ofNullable;

使用示例:

@Test
public void test2() {
    String value = "Hello, world!";
    Optional<String> optional = Optional.of(value);
    // 如果 value 不为 null,则 optional 包含 value 的值
    System.out.println(optional.get());  // 输出 "Hello, world!"
    // 如果 value 为 null,则 optional 为空
    Optional<String> emptyOptional = Optional.ofNullable(null);
    System.out.println(emptyOptional.isPresent());  // 输出 "false"
}

        在上面的示例中,我们使用 Optional#of() 方法创建了一个包含字符串值的 Optional 对象。如果该值不为 null,则可以通过调用 get() 方法来获取该值;如果该值为 null,则使用Optional.ofNullable()返回一个空的 Optional 对象。

Optional#get()

        Optional#get()是Java 8中Optional类的一个主要方法,用于获取Optional对象中封装的数据值。它的功能作用是当Optional对象中存在有效值时,返回该值;否则,抛出一个NoSuchElementException异常。

        使用场景:

  1. 当你期望Optional对象中一定存在有效值时,可以使用get()方法直接获取该值。
  2. 当你需要从Optional对象中获取一个默认值时,可以使用getOrDefault()方法,它会在Optional对象中不存在有效值时返回一个默认值。
  3. 在进行链式调用时,可以使用get()方法来获取上一个Optional对象的结果。

        使用示例:

@Test
public void test3() {
    Optional<String> optional = Optional.of("Hello");
    String value = optional.get(); // 获取Optional对象中的值
    System.out.println(value); // 输出: Hello
}

        如果Optional对象中不存在有效值,使用get()方法会抛出NoSuchElementException异常:

@Test
public void test4() {
    Optional<String> optional = Optional.empty();
    String value = optional.get(); // 抛出 NoSuchElementException 异常
}

        为了避免异常的发生,可以使用isPresent()方法先检查Optional对象中是否存在有效值:

@Test
public void test5() {
    Optional<String> optional = Optional.empty();
    if (optional.isPresent()) {
        String value = optional.get(); // 获取值或抛出异常
        System.out.println(value);
    } else {
        System.out.println("Value not present");
    }
}

Optional#isPresent()

        Optional.isPresent()是Java 8中Optional类的一个方法。它的功能作用是检查Optional对象中是否有值,如果有值则返回true,否则返回false。

        使用场景:

  1. 当你需要检查一个值是否存在时,可以使用Optional.isPresent()
  2. 在函数式编程中,Optional.isPresent()

使用示例:

@Test
public void test6() {
    Optional<String> optional = Optional.ofNullable(null);
    if (optional.isPresent()) {
        System.out.println("Value is present!");
    } else {
        System.out.println("Value is not present.");
    }
}

        在这个示例中,我们首先通过Optional.ofNullable()方法创建了一个Optional对象。然后,我们使用isPresent()方法检查值是否存在。如果值存在,我们就打印"Value is present!",否则打印"Value is not present."。

Optional#isEmpty()

        Optional#isEmpty()是Java 8中Optional类的一个方法,用于检查Optional对象是否为空。如果Optional对象中没有包含任何值,即值是null,那么isEmpty()方法将返回true,否则返回false。

        功能作用:

  1. 检查Optional对象是否为空:使用isEmpty()方法可以判断Optional对象是否不包含任何值,即值是否为null。
  2. 提供安全访问:通过检查Optional对象是否为空,可以避免在尝试访问空值时出现NullPointerException。

        使用场景:

  1. 参数校验:在方法中接收一个Optional参数时,可以使用isEmpty()方法进行参数校验,确保参数非空。
  2. 链式调用:在链式调用中,可以使用isEmpty()方法判断链式调用是否已经结束,或者下一个可用的元素是否存在。
  3. 异常处理:在处理可能为null的值时,可以使用isEmpty()方法进行异常处理,以避免出现NullPointerException。

        使用示例:        

@Test
public void test7(){
    Optional<String> optional = Optional.of(new ArrayList<>()).empty();
    if (optional.isEmpty()) {
        System.out.println("Optional对象为空");
    } else {
        System.out.println("Optional对象不为空,值为:" + optional.get());
    }
}

        在上面的示例中,我们创建了一个空的Optional对象optional,然后使用isEmpty()方法检查其是否为空。由于optional是一个空的Optional对象,因此isEmpty()方法返回true,输出"Optional对象为空"。

Optional#ifPresent()

        Optional#ifPresent()是Java 8中Optional类的一个方法,用于在Optional对象非空时执行指定的操作。

        功能作用:

  1. 条件判断:ifPresent()方法判断Optional对象是否非空,如果非空则执行指定的操作。
  2. 避免NullPointerException:通过ifPresent()方法可以避免在Optional对象为空时执行操作而导致的NullPointerException。
  3. 代码简洁性:使用ifPresent()方法可以使代码更加简洁和易读,避免过多的if语句。

        使用场景:

  1. 条件判断:在需要判断Optional对象是否非空并执行操作的情况下,可以使用ifPresent()方法。例如,在需要读取文件时,可以使用Optional#ifPresent()方法判断文件是否存在并读取文件内容。
  2. 链式调用:在链式调用中,可以使用ifPresent()方法判断链式调用是否已经结束,或者下一个可用的元素是否存在。
  3. 异常处理:在处理可能为null的值时,可以使用ifPresent()方法进行异常处理,以避免出现NullPointerException。

        使用示例:

@Test
public void test8(){
    Optional<String> optional = Optional.ofNullable(null);
    optional.ifPresent(s -> System.out.println("值不为空,值为:" + s));
    Optional<String> optional2 = Optional.ofNullable("hello");
    optional2.ifPresent(s -> System.out.println("值不为空,值为:" + s));
}

        在上面的示例中,我们首先使用getNullableString()方法返回一个可能为null的String对象,然后将其封装为一个Optional对象optional。接着,我们使用ifPresent()方法判断optional是否非空,如果非空则打印出字符串的值。

Optional#ifPresentOrElse()

        Optional#ifPresentOrElse()是Java 8中Optional类的一个方法,用于在Optional对象非空时执行指定的操作,否则执行另一个指定的操作。它允许在Optional对象存在时进行条件判断和执行相应的操作。

        功能作用:

  1. 条件判断:ifPresentOrElse()方法接受两个参数,第一个参数是一个Lambda表达式,用于判断Optional对象是否非空;第二个参数也是一个Lambda表达式,用于在Optional对象非空时执行相应的操作。
  2. 避免NullPointerException:通过使用ifPresentOrElse()方法,可以在Optional对象非空时执行相应的操作,避免了直接访问空值时可能出现的NullPointerException异常。

        使用场景:

  1. 条件处理:当需要基于Optional对象是否存在进行条件处理时,可以使用ifPresentOrElse()方法。例如,根据Optional对象是否非空来决定执行哪些操作或者返回默认值。
  2. 链式调用:在链式调用中,可以使用ifPresentOrElse()方法进行条件判断和执行相应的操作,以实现更简洁的代码。

        使用示例:

@Test
public void test9() {
    Optional<String> optional = Optional.ofNullable(null);
    optional.ifPresentOrElse(
            value -> System.out.println("Optional对象非空,值为:" + value),
            () -> System.out.println("Optional对象为空")
    );
    Optional<String> optional2 = Optional.ofNullable("hello");
    optional2.ifPresentOrElse(
            value -> System.out.println("Optional对象非空,值为:" + value),
            () -> System.out.println("Optional对象为空")
    );
}

        在上面的示例中,我们首先获取一个可能为null的字符串,然后将其封装在一个Optional对象中。接下来,我们使用ifPresentOrElse()方法进行条件判断。如果Optional对象非空,就输出该值;否则,输出"Optional对象为空"。由于该示例中的Optional对象是非空的,因此会输出"Optional对象非空,值为:"加上该字符串的值。

Optional#filter()

        Optional#filter()是Java 8中Optional类的一个方法,用于过滤Optional对象中的值。它接受一个Predicate接口作为参数,该接口用于定义一个判断条件。当Optional对象非空并且满足给定的条件时,filter()方法将返回一个包含该值的Optional对象;否则,返回一个空的Optional对象。

        功能作用:

  1. 过滤值:使用filter()方法可以过滤Optional对象中的值,只保留满足特定条件的值。
  2. 提高代码的可读性:通过使用lambda表达式和filter()方法,可以将复杂的条件逻辑集中在一个地方,使代码更加简洁和易于理解。

        使用场景:

  1. 条件判断:当需要对Optional对象中的值进行条件判断时,可以使用filter()方法来过滤出符合条件的值。
  2. 流式编程:在流式编程中,可以使用filter()方法来对元素进行筛选,以实现更灵活和高效的数据处理。

        使用示例:

@Test
public void test10(){
    Optional<String> optional = Optional.of("Hello");
    Optional<String> filteredOptional = optional.filter(s -> s.startsWith("H"));
    if (filteredOptional.isPresent()) {
        System.out.println(filteredOptional.get()); // 输出 "Hello"
    } else {
        System.out.println("Optional对象为空或条件不满足");
    }
}

        在上面的示例中,我们创建了一个包含字符串"Hello"的Optional对象optional,然后使用filter()方法来过滤出以"H"开头的字符串。由于optional中的值满足以"H"开头的条件,因此filter()方法返回一个包含该值的Optional对象。最后,我们使用isPresent()方法检查Optional对象是否非空,并使用get()方法获取值。

Optional#map()

        Optional#map()是Java 8中Optional类的一个方法,用于将Optional对象中的值转换为一个新的值。它接受一个函数作为参数,该函数用于将Optional对象中的值转换为一个新的值。如果Optional对象为空,map()方法不会执行转换操作。

        功能作用:

  1. 转换Optional对象中的值:通过传递一个函数作为参数,map()方法可以将Optional对象中的值转换为一个新的值。
  2. 提供安全访问:在Optional对象为空的情况下,map()方法不会尝试执行转换操作,从而避免出现NullPointerException。

        使用场景:

  1. 类型转换:可以使用map()方法将Optional对象中的值转换为一个新的类型,例如将String类型的值转换为Integer类型。
  2. 条件操作:可以使用map()方法根据Optional对象中的值执行条件操作,例如根据一个字符串的长度是否大于某个阈值来决定是否执行某个操作。
  3. 链式调用:在链式调用中,可以使用map()方法将Optional对象中的值转换为一个新的值,并将其传递给下一个操作。

        使用示例:

@Test
public void test11(){
    Optional<String> optional = Optional.of("Hello");
    Optional<Integer> result = optional.map(str -> str.length());
    if (result.isPresent()) {
        System.out.println("Length of string: " + result.get());
    } else {
        System.out.println("Optional对象为空");
    }
    Optional<String> optional2 = Optional.ofNullable(null);
    Optional<Integer> result2 = optional.map(str -> str.length());
    if (result2.isPresent()) {
        System.out.println("Length of string: " + result2.get());
    } else {
        System.out.println("Optional对象为空");
    }
}

        在上面的示例中,我们创建了一个包含字符串"Hello"的Optional对象optional,然后使用map()方法将其转换为一个包含字符串长度的Optional对象result。由于optional不为空,map()方法执行了转换操作,将字符串"Hello"的长度作为新值存储在result中。最后,我们检查result是否为空,如果不为空则输出字符串的长度。

Optional#flatMap()

        Optional#flatMap()是Java 8中Optional类的一个方法,用于将Optional对象中的值映射为另一个Optional对象,

        功能作用:

  1. 映射Optional对象:使用flatMap()方法可以将一个Optional对象中的值映射为另一个Optional对象。这个方法接受一个函数作为参数,这个函数用于处理Optional对象中的值。

        使用场景:

  1. 链式调用:在链式调用中,可以使用flatMap()方法将一个Optional对象转换为一个Stream,然后再对Stream进行处理。这种做法可以使代码更加简洁和易读。
  2. 处理复杂数据结构:当需要处理复杂的数据结构时,可以使用flatMap()方法将嵌套的Optional对象转换为简单的Stream,以便于进一步处理。

        使用示例:

        在下面的示例中,我们首先创建了一个String类型的name,并将其封装在一个Optional对象中。然后,我们使用flatMap()方法将这个Optional对象转换为另一个Optional对象,办的的逻辑是把原先的小写字符转换为大写字符,最后使用optional.get()取出转换结果并输出。

@Test
public void test12() {
    String name = "fanfu1024";
    Optional<String> optional = Optional.of(name).flatMap(item -> Optional.of(item.toUpperCase()));
    String name2 = optional.get();
    System.out.println(name2);//输出结果:FANFU1024
}

Optional#or()

        Optional#or()是Java 8中Optional类的一个方法,用于在Optional对象为空时提供一个默认值,或者在Optional对象为空时执行一个备用操作。这个方法在处理可能为null的值时非常有用,可以避免出现NullPointerException。

        功能作用:

  1. 提供默认值:当Optional对象为空时,or()方法可以提供一个默认值。这个默认值可以是任何类型,包括对象、基本类型、集合等。
  2. 执行备用操作:当Optional对象为空时,or()方法还可以执行一个备用操作。这个操作可以是任何代码块,包括函数、方法调用等。

        使用场景:

  1. 默认值处理:在需要使用可能为null的值时,可以使用or()方法提供一个默认值,以避免出现NullPointerException。
  2. 备用操作处理:当需要在Optional对象为空时执行某些操作时,可以使用or()方法执行这些备用操作。

        使用示例:

@Test
public void test13(){
    Optional<String> optional = Optional.empty();
    String value = optional.or(() -> Optional.of("default value")).get();// 提供默认值
    System.out.println(value); // 输出"default value"

    Optional<String> optional2 = Optional.of("Hello");
    String value2 = optional2.or(() -> Optional.of("default value")).get(); // 执行备用操作
    System.out.println(value2); // 输出"Hello"
}

        在上面的示例中,我们首先创建了一个空的Optional对象optional,然后使用or()方法提供一个默认值"default value",当optional为空时将返回这个默认值。然后我们创建了一个包含字符串"Hello"的Optional对象optional2,使用or()方法执行一个备用操作,当optional2为空时返回"default value",但是由于optional2包含值"Hello",因此返回"Hello"。这个示例展示了or()方法在处理Optional对象时的使用。

Optional#stream()

        Optional#stream()是Java 8中Optional类的一个方法,用于将Optional对象转换为一个Stream。这个方法在需要使用流式编程处理数据时非常有用。

        功能作用:

  1. 转换类型:将Optional对象转换为Stream类型,以便进行流式编程。
  2. 空值处理:当Optional对象为空时,stream()方法返回一个空的Stream。

        使用场景:

  1. 流式编程:使用stream()方法可以将Optional对象转换为Stream,然后与其他流式编程的方法一起使用,实现更灵活和高效的数据处理。
  2. 链式调用:在链式调用中,可以使用stream()方法将每个Optional对象转换为一个Stream,然后进行进一步的处理。
  3. 复杂数据结构处理:当处理复杂数据结构时,可以使用stream()方法将嵌套的Optional对象展开,以便更好地处理数据。

        使用示例:

@Test
public void test14(){
    Optional<String> optional = Optional.of("Hello");
    Stream<String> stream = optional.stream(); // 将Optional对象转换为Stream
    List<String> result = stream.collect(Collectors.toList()); // 将Stream转换为List
    System.out.println(result); // 输出["Hello"]
}

        在上面的示例中,我们创建了一个包含字符串"Hello"的Optional对象optional,然后使用stream()方法将其转换为Stream对象stream。接着,我们将stream转换为List对象result。这个示例展示了stream()方法在将Optional对象转换为Stream时的使用。

Optional#orElse()

        Optional#orElse()是Java 8中Optional类的一个方法,用于在Optional对象为空时返回一个默认值,或者在Optional对象为空时执行一个备用操作。这个方法在处理可能为null的值时非常有用,可以避免出现NullPointerException。

        功能作用:

  1. 返回默认值:当Optional对象为空时,orElse()方法可以提供一个默认值。这个默认值可以是任何类型,包括对象、基本类型、集合等。
  2. 执行备用操作:当Optional对象为空时,orElse()方法还可以执行一个备用操作。这个操作可以是任何代码块,包括函数、方法调用等。

        使用场景:

  1. 默认值处理:在需要使用可能为null的值时,可以使用orElse()方法提供一个默认值,以避免出现NullPointerException。
  2. 备用操作处理:当需要在Optional对象为空时执行某些操作时,可以使用orElse()方法执行这些备用操作。

        使用示例:

@Test
public void test15() {
    Optional<String> optional = Optional.empty();
    String value = optional.orElse("default value"); // 返回默认值
    System.out.println(value); // 输出"default value"

    Optional<String> optional2 = Optional.of("Hello");
    String value2 = optional2.orElse("default value"); // 执行备用操作
    System.out.println(value2); // 输出"Hello"
}

        在上面的示例中,我们首先创建了一个空的Optional对象optional,然后使用orElse()方法提供一个默认值"default value",当optional为空时将返回这个默认值。然后我们创建了一个包含字符串"Hello"的Optional对象optional2,使用orElse()方法执行一个备用操作,当optional2为空时返回"default value",但是由于optional2包含值"Hello",因此返回"Hello"。这个示例展示了orElse()方法在处理Optional对象时的使用。

Optional#orElseGet()

        Optional#orElseGet()是Java 8中Optional类的一个方法,用于在Optional对象为空时返回一个默认值,或者在Optional对象为空时执行一个备用生成器。这个方法在处理可能为null的值时非常有用,可以避免出现NullPointerException。

        功能作用:

  1. 提供默认值:当Optional对象为空时,orElseGet()方法可以返回一个默认值。这个默认值是由一个Supplier接口的实现提供的,可以是一个对象、基本类型、集合等。
  2. 执行备用生成器:当Optional对象为空时,orElseGet()方法还可以执行一个备用生成器。这个生成器是一个Supplier接口的实现,可以生成一个值作为默认值。

        使用场景:

  1. 默认值处理:在需要使用可能为null的值时,可以使用orElseGet()方法返回一个默认值,以避免出现NullPointerException。
  2. 备用生成器处理:当需要在Optional对象为空时执行某些操作并生成一个值作为默认值时,可以使用orElseGet()方法执行这些备用生成器。

        使用示例:

@Test
public void test16() {
    Optional<String> optional = Optional.empty();
    String value = optional.orElseGet(() -> "default value"); // 返回默认值
    System.out.println(value); // 输出"default value"

    Optional<String> optional2 = Optional.of("Hello");
    String value2 = optional2.orElseGet(() -> "default value"); // 执行备用生成器
    System.out.println(value2); // 输出"Hello"
}

        在上面的示例中,我们首先创建了一个空的Optional对象optional,然后使用orElseGet()方法返回一个默认值"default value",当optional为空时将返回这个默认值。然后我们创建了一个包含字符串"Hello"的Optional对象optional2,使用orElseGet()方法执行一个备用生成器,当optional2为空时返回"default value",但是由于optional2包含值"Hello",因此返回"Hello"。这个示例展示了orElseGet()方法在处理Optional对象时的使用。

Optional#orElseThrow()

        Optional#orElseThrow()是Java 8中Optional类的一个方法,用于在Optional对象为空时抛出一个异常。这个方法在需要确保一个值存在的情况下非常有用,如果该值不存在,则可以通过orElseThrow()方法抛出一个定制的异常。

        功能作用:

  1. 抛出异常:当Optional对象为空时,orElseThrow()方法将抛出一个异常。可以提供自定义的异常信息或异常类型。
  2. 强制要求值存在:通过orElseThrow()方法,可以强制要求Optional对象中存在一个值,否则将抛出异常。

        使用场景:

  1. 参数校验:在方法中接收一个Optional参数时,可以使用orElseThrow()方法进行参数校验,确保参数非空。
  2. 流程控制:在某些情况下,需要在Optional对象为空时中断当前操作并抛出异常,以便进行特殊处理。
  3. 异常处理:当需要在Optional对象为空时抛出异常时,可以使用orElseThrow()方法实现这一需求。

        使用示例:

@Test
public void test17() {
    Optional<String> optional = Optional.of("Hello");
    String value = optional.orElseThrow(() -> new NoSuchElementException("注意:空值!!!"));
    System.out.println(value); // 正常情况,输出"Hello"
    Optional<String> optional2 = Optional.empty();
    String value2 = optional2.orElseThrow(() -> new NoSuchElementException("注意:空值!!!"));
    System.out.println(value); // 抛出异常
}

        在上面的示例中,我们创建了一个空的Optional对象optional,然后使用orElseThrow()方法抛出一个NoSuchElementException异常。当optional为空时,将抛出该异常并中断程序的执行。因此,在使用orElseThrow()方法时需要注意异常处理和流程控制,以确保程序的正确性和稳定性。

总结

        总之,Optional类提供了一些方法,可以更好地处理可能为null的情况,提供更多的选择和个性化服务,使代码更加简洁、灵活和易读。在使用Optional类时,需要根据具体的需求选择合适的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1237955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中&#xff0c;暴露在外网的接口&#xff0c;为了访问的安全&#xff0c;都是需要在http请求中传入登录时颁发的token。这时候&#xff0c;我们需要有专门用来做校验token并解析用户信息的服务。如下图所示&#xff0c;http请求先经过api网关&#xff0c;网…

【word技巧】Word制作试卷,ABCD选项如何对齐?

使用word文件制作试卷&#xff0c;如何将ABCD选项全部设置对齐&#xff1f;除了一直按空格或者Tab键以外&#xff0c;还有其他方法吗&#xff1f;今天分享如何将ABCD选项对齐。 首先&#xff0c;我们打开【替换和查找】&#xff0c;在查找内容输入空格&#xff0c;然后点击全部…

渗透工具---BurpSuite 插件开发之HelloWorld

本文主要记录如何利用burp官方的新版API即MontoyaApi 写helloworld&#xff08;上一篇的demo使用旧版api写的&#xff0c;这篇及后续开发将采用新版api&#xff09; 先看效果图 更多详细内容见下方 这里有更详细更全面的代码内容 以及配置相关的内容 https://mp.weixin.qq.co…

面试题-8

1.vue路由是怎么传参的&#xff1f; params传参 this.$router.push({name:index}) this.$route.params.id 路由属性传参 this.$router.push({name:/index/${item.id}}) 配置路由{path:/index:id} query传参(可以解决页面刷新参数丢失的问题) this.$router.push({ name…

云原生入门系列(背景和驱动力)

做任何一件事&#xff0c;或者学习、应用一个领域的技术&#xff0c;莫过于先要想好阶段的目标和理解、学习它的意义是什么&#xff1f;解决了什么问题&#xff1f; 这部分&#xff0c;就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…

海辰储能与FlexGen签署储能系统合作协议,加快拓展北美市场

海辰储能宣布与美国储能技术提供商和系统集成商FlexGen达成合作协议。根据协议&#xff0c;海辰储能将为FlexGen供应10GWh的先进储能产品&#xff1b;同时&#xff0c;其将支持FlexGen能源管理系统(EMS)用于总容量为15GWh的项目。 作为协议的一部分&#xff0c;FlexGen还将成为…

Windows 7 连接 Windows 10 共享打印机,Windows 无法连接打印机,操作失败,错误为0x0000011b 的终极解决办法

Windows 7 连接 Windows 10 共享打印机出现错误 0x000001b&#xff0c;建议不要通过卸载Windows10系统的KB5005565安全更新来解决该问题&#xff08;犹如削足适履&#xff09;&#xff0c;正确的处理方法是手工添加一个本地打印机&#xff0c;本方法是安全可靠的。本文详述了该…

双12电视盒子推荐:测评员解析目前电视盒子哪个最好

电视盒子不需要每月缴费&#xff0c;只需联网就可以收看海量视频资源&#xff0c;游戏、网课、投屏等功能让电视盒子的使用场景更丰富&#xff0c;我每年都会进行数十次电视盒子测评&#xff0c;本期要分享的是双十二电视盒子推荐&#xff0c;全面解析目前电视盒子哪个最好。 一…

【数据结构】链表的八种形态

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 链表的三大"性状" 一.带头链表和不带头链表 头指针与头结点的异同 头指针 头结点 二.循环链表和非循环链表 三.双向链表和单向链表 链表的八大形态 结语…

Amlogic方案遥控器配置(Android11)

配置路线 键值变化路径&#xff1a; ScanCode --> Keycode Lable --> KeyCode Layout --> KeyLable --> Keycode – > KeyEvent 文件映射路径&#xff1a; *.dtsi --> input-event-codes.h --> *.kl --> InputEventLable.h --> kecodes.h --> P…

laravel引入element-ui后,blade模板中使用elementui时,事件未生效问题(下载element-ui到本地直接引入项目)

背景 重构公司后台项目&#xff0c;使用了dcat-admin&#xff0c;但是dcat-admin有些前端功能不能满足需求。因此引入element-ui进行相关界面的优化 具体流程 1.下载element-ui到本地 2.进入如下目录 打开 node_modules\element-ui\lib 复制index.js 打开 node_modules/ele…

UE4基础篇十五:AI行为树

一、学习完教程后需要掌握知识点 1.1、基础概念: 1.1 行为树:控制并显示AI的决策制定过程 1.2 黑板:可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的逻辑 1.3 环境查询: 获取地图环境中的信息进行一个筛选,查找到所需要的的…

微信公众号上怎么做微信助力活动

微信公众号微信助力活动&#xff1a;一起分享&#xff0c;一起成长 在当今社交媒体时代&#xff0c;人们之间的互动和分享变得越来越重要。微信公众号作为一个广受欢迎的社交平台&#xff0c;为人们提供了一个便捷的分享和交流渠道。而微信助力活动则是通过分享和互动&#xf…

【算法萌新闯力扣】:两句话中的不常见单词

力扣热题&#xff1a;两句话中的不常见单词 开篇 今天是备战蓝桥杯的第19天&#xff0c;今天到目前刷了4道力扣算法题。其中&#xff0c;这道题是对我来说收获最大的一道&#xff0c;让我更熟练地掌握了一些算法题中方法&#xff0c;于是来与大家分享一下。 题目链接: 884.两…

听说90%的人都没搞定手撕协程池这道面试题!

特别的缘分 听说90%的人都没搞定手撕协程池这道面试题&#xff01; 能看到这篇文章一定是特殊的缘分&#xff0c;请务必珍惜&#xff0c;请详细看看吧&#xff0c;哈哈。 不止上图&#xff0c;最近 Go就业训练营 中不少小伙伴说&#xff0c;面试中碰到了好几次手撕协程池的问题…

向上转型 向下转型 重写 多态 ---java

目录 一. 向上转型 1.1 概念 1.2 语法格式 1.3 动态绑定引入 1.4 重写的引入 1.5向上转型的使用方式 方式一: 直接赋值 方式二: 通过传参,进行向上转型(多态引入) 方法三:通过返回值, 进行向上转型 二. 重写 2.1 概念 2.2 重写的格式 2.3 重写的规则 【重写和重…

QT mysql 数据库线程池 与数据库操作封装

最近事情比较多很久没有写学习笔记了&#xff0c;数据库线程池&#xff0c; 数据库封装&#xff0c;虽说数据库操作有很多不需要写sql 的&#xff0c;ORM 封装的方式去操作数据库。但是从业这些年一直是自己动手写sql &#xff0c;还是改不了这个习惯。不说了直接上代码。 数据…

YOLOv5 环境搭建

YOLOv5 环境搭建 flyfish 环境 Ubuntu20.04 驱动、CUDA Toolkit、cuDNN、PyTorch版本对应 1 NVIDIA驱动安装 在[附加驱动界]面安装驱动时&#xff0c;需要输入安全密码&#xff0c;需要记下&#xff0c;后面还需要输入这个密码 重启之后有的机器会出现 perform mok manage…

【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍 1.1简介 Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时&#xff…

微信订房功能怎么做_公众号里怎么实现在线订房系统

微信公众号在线订房系统&#xff1a;一键解决您的住宿问题 在当今数字化时代&#xff0c;微信公众号已经成为人们生活中不可或缺的一部分。它提供了各种各样的功能和服务&#xff0c;让我们的生活变得更加便捷和高效。而如今&#xff0c;微信公众号也实现了在线订房功能&#…