写在前面
在这篇文章中,我们将深入探讨Java 8引入的Optional类,并展示它在实际应用中的价值和好处。Optional类是一种用于处理可能为空的值的容器类型。通过使用Optional类,我们可以更加优雅地处理可能存在空值的情况,避免了繁琐的空值检查和异常处理。通过阅读本文,您将学会如何正确地处理可能为空的值,避免空指针异常,并提高代码的可靠性和可维护性。无论您是Java初学者还是有经验的开发者,都能从中获得实用的知识和技巧。
Java 8中的Optional类是一个容器类,用于解决null值引发的问题,并提供了一种更安全的方式来处理值可能为null的情况。
Optional类的主要目的是为了解决空指针异常(NullPointerException)的问题。在Java中,使用null值是一种常见的做法,但是这可能会导致运行时异常,特别是在进行对象引用的操作时。Optional类提供了一种方式来更明确地处理可能为null的值,从而避免出现NullPointerException。
Optional类提供了一些方法来检查值是否存在以及获取值。例如,isPresent()方法用于检查值是否存在,get()方法用于获取值,orElse()方法用于提供一个默认值,orElseGet()方法用于提供一个生成值的表达式,orElseThrow()方法用于提供一个异常。
使用Optional类可以使得代码更加简洁、安全和易于理解。通过使用Optional类,开发者可以明确地表明值可能为null,并且可以提供适当的处理方式。这有助于减少运行时异常,提高代码的可靠性和可维护性。
作为java8新增特性中一个非常重要的内容,Optional类当然不同凡响,其特点必须是鲜明的,且往下看:
总之,Java 8的Optional类是一个非常有用的工具,它提供了更安全、更灵活和更简洁的方式来处理可能为null的值。
Optional的核心方法
掌握其核心方法的使用,其实也没有什么窍门,就是逐一击破。下面将逐一给小伙伴一一展示每一个方法的功能作用和使用方法,建议先行关注和收藏,以便后续想用时随时可以找到。
Optional#empty()
Optional.empty()是Optional类的一个静态方法,用于返回一个空的Optional对象。这个方法的主要功能作用是提供一个默认的Optional对象,当需要使用Optional但实际没有值可供包装时,就可以使用Optional.empty()来代替。
使用场景:
使用示例:
@Test
public void test() {
List list=new ArrayList();
Optional 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 optional = Optional.of(value);
// 如果 value 不为 null,则 optional 包含 value 的值
System.out.println(optional.get()); // 输出 "Hello, world!"
// 如果 value 为 null,则 optional 为空
Optional 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异常。
使用场景:
使用示例:
@Test
public void test3() {
Optional optional = Optional.of("Hello");
String value = optional.get(); // 获取Optional对象中的值
System.out.println(value); // 输出: Hello
}
如果Optional对象中不存在有效值,使用get()方法会抛出NoSuchElementException异常:
@Test
public void test4() {
Optional optional = Optional.empty();
String value = optional.get(); // 抛出 NoSuchElementException 异常
}
为了避免异常的发生,可以使用isPresent()方法先检查Optional对象中是否存在有效值:
@Test
public void test5() {
Optional 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。
使用场景:
使用示例:
@Test
public void test6() {
Optional 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。
功能作用:
使用场景:
使用示例:
@Test
public void test7(){
Optional 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对象非空时执行指定的操作。
功能作用:
使用场景:
使用示例:
@Test
public void test8(){
Optional optional = Optional.ofNullable(null);
optional.ifPresent(s -> System.out.println("值不为空,值为:" + s));
Optional 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对象存在时进行条件判断和执行相应的操作。
功能作用:
使用场景:
使用示例:
@Test
public void test9() {
Optional optional = Optional.ofNullable(null);
optional.ifPresentOrElse(
value -> System.out.println("Optional对象非空,值为:" + value),
() -> System.out.println("Optional对象为空")
);
Optional 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对象。
功能作用:
使用场景:
使用示例:
@Test
public void test10(){
Optional optional = Optional.of("Hello");
Optional 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()方法不会执行转换操作。
功能作用:
使用场景:
使用示例:
@Test
public void test11(){
Optional optional = Optional.of("Hello");
Optional result = optional.map(str -> str.length());
if (result.isPresent()) {
System.out.println("Length of string: " + result.get());
} else {
System.out.println("Optional对象为空");
}
Optional optional2 = Optional.ofNullable(null);
Optional 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对象,
功能作用:
使用场景:
使用示例:
在下面的示例中,我们首先创建了一个String类型的name,并将其封装在一个Optional对象中。然后,我们使用flatMap()方法将这个Optional对象转换为另一个Optional对象,办的的逻辑是把原先的小写字符转换为大写字符,最后使用optional.get()取出转换结果并输出。
@Test
public void test12() {
String name = "fanfu1024";
Optional 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。
功能作用:
使用场景:
使用示例:
@Test
public void test13(){
Optional optional = Optional.empty();
String value = optional.or(() -> Optional.of("default value")).get();// 提供默认值
System.out.println(value); // 输出"default value"
Optional 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。这个方法在需要使用流式编程处理数据时非常有用。
功能作用:
使用场景:
使用示例:
@Test
public void test14(){
Optional optional = Optional.of("Hello");
Stream stream = optional.stream(); // 将Optional对象转换为Stream
List 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。
功能作用:
使用场景:
使用示例:
@Test
public void test15() {
Optional optional = Optional.empty();
String value = optional.orElse("default value"); // 返回默认值
System.out.println(value); // 输出"default value"
Optional 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。
功能作用:
使用场景:
使用示例:
@Test
public void test16() {
Optional optional = Optional.empty();
String value = optional.orElseGet(() -> "default value"); // 返回默认值
System.out.println(value); // 输出"default value"
Optional 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()方法抛出一个定制的异常。
功能作用:
使用场景:
使用示例:
@Test
public void test17() {
Optional optional = Optional.of("Hello");
String value = optional.orElseThrow(() -> new NoSuchElementException("注意:空值!!!"));
System.out.println(value); // 正常情况,输出"Hello"
Optional optional2 = Optional.empty();
String value2 = optional2.orElseThrow(() -> new NoSuchElementException("注意:空值!!!"));
System.out.println(value); // 抛出异常
}
在上面的示例中,我们创建了一个空的Optional对象optional,然后使用orElseThrow()方法抛出一个NoSuchElementException异常。当optional为空时,将抛出该异常并中断程序的执行。因此,在使用orElseThrow()方法时需要注意异常处理和流程控制,以确保程序的正确性和稳定性。
总结
总之,Optional类提供了一些方法,可以更好地处理可能为null的情况,提供更多的选择和个性化服务,使代码更加简洁、灵活和易读。在使用Optional类时,需要根据具体的需求选择合适的方法。