Java8新判空方法之Optional类的使用详解
简介
在Java8中,我们可以使用Optional类来优雅地处理 null 值的情况。 Optional 是一个容器对象,可能包含可null 可非null 的值。使用 Optional类,我们可以减少代码中出现的nullPointerException异常,从而使代码更加优雅。
Optional类的使用方式
创建Optional对象
创建 Optional 对象的方式如下:
Optional<String> optionalString1 = Optional.empty(); //创建一个空的 Optional 对象
Optional<String> optionalString2 = Optional.of("hello"); //创建一个包含初始值的 Optional 对象,初始值不能为null
Optional<String> optionalString3 = Optional.ofNullable(null); //创建一个包含初始值的 Optional 对象,初始值允许为null
- empty() 创建一个空的 Optional 对象。
- of(Object obj) 创建一个包含初始值的 Optional 对象,初始值必须为非null。
- ofNullable(Object obj) 创建一个包含初始值的 Optional 对象,初始值可以为null。
判断Optional对象是否存在值
使用ifPresent()方法或者isPresent()方法,来判断 Optional 对象是否包含值,如下示例:
Optional<String> optionalString = Optional.of("hello");
if(optionalString.isPresent()){
System.out.println(optionalString.get()); //输出:hello
}
获取Optional对象的值
- 使用 get() 方法来获取 Optional 对象的值,但是在调用该方法之前,使用 isPresent() 方法先判断 Optional 对象是否存在值,防止返回 null 值。
Optional<String> optionalString = Optional.of("hello");
if(optionalString.isPresent()){
System.out.println(optionalString.get()); //输出:hello
}
- 使用 orElse() 方法获取 Optional 对象的值,如果 Optional 对象的值不为 null,则返回 Optional 对象的值;如果 Optional 对象的值为 null,则返回我们指定的默认值。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElse("world");
System.out.println(result); //输出:world
- 使用 orElseGet() 方法获取 Optional 对象的值,如果 Optional 对象的值不为 null,则返回 Optional 对象的值;如果 Optional 对象的值为 null,则调用 Supplier 函数式接口来获取默认值。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElseGet(() -> "world");
System.out.println(result); //输出:world
- 使用 orElseThrow() 方法在 Optional 对象的值为 null 时,抛出指定的异常。
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElseThrow(NullPointerException::new);
使用map()和flatMap()方法获取Optional对象中的值
使用 map() 和 flatMap() 方法来获取 Optional 对象中的值,这两个方法可以优雅地处理 null 值的情况。
- 使用 map() 方法来将 Optional 对象中的值进行转换,如果 Optional 对象的值为 null,则返回一个空的 Optional 对象。
Optional<String> optionalString = Optional.of("hello");
Optional<Integer> optionalInteger = optionalString.map(String::length);
System.out.println(optionalInteger.get()); //输出:5
- 使用 flatMap() 方法来将 Optional 对象中的值进行转换,如果 Optional 对象的值为 null,则返回一个空的 Optional 对象。
Optional<String> optionalString = Optional.of("hello");
Optional<Integer> optionalInteger = optionalString.flatMap(str -> Optional.of(str.length()));
System.out.println(optionalInteger.get()); //输出:5
示例
下面通过两个例子说明 Optional 类的使用。
//示例1:正常情况下的传统代码
String str = "hello";
if(str != null){
System.out.println(str.length());
}
//使用 Optional 类优雅地处理 null 值
Optional<String> optionalStr = Optional.ofNullable("hello");
int length = optionalStr.map(String::length).orElse(0);
System.out.println(length);
//示例2:在Lambda表达式中使用 Optional 类
List<String> list = Arrays.asList("hello", null, "world");
list.stream()
.filter(val -> Optional.ofNullable(val).isPresent())
.map(val -> val.toUpperCase())
.forEach(System.out::println);
总结
使用 Optional 类可以避免代码中出现空指针异常,使代码更加优雅、简单。建议在 Java8 及以上版本的开发中,使用 Optional 类优雅地处理 null 值的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java8中新判空方法之Optional类的使用详解 - Python技术站