Optional的详细使用
文章目录
- 一、使用
- 1.创建对象
- 2.安全消费
- 3.安全获取值
- 4.过滤
- 5.判断
- 总结
- 1.orElse 和 orElseGet 方法区别:
- 2.map 和 flatMap 方法区别:
一、使用
1.创建对象
- 1.1 Optional类似是包装类,可以把具体的数据封装在其中,然后使用里面封装好的方法可以有效防止空指针
一般通过Optional类中的ofNullable方法来把数据封装到Optional类
public class Test03 {
public static void main(String[] args) {
Author author = author();
Optional<Author> author1 = Optional.ofNullable(author);
author1.ifPresent(author2 -> System.out.println(author2.getName()));
author1.ifPresent(author2 -> System.out.println(author2.getAge()));
System.out.println(author1);
}
public static Author author(){
Author author = new Author(1,"峰哥",25);
return author;
}
}
结果:
- 1.2 如果一个值确定不为空的情况下,可以使用Optional类中的of方法来把数据封装到Optional类(有bug,可以传个空试试)
Optional<Object> o = Optional.of(null);
System.out.println(o);
结果:
- 1.3 当判断发现某个计算返回值为null时,需要把null值封装成Optional对象返回,可以采用Optional类中的empty方法
public static Optional<Author> getAuthor(){
Author author = new Author(1,"峰哥",25);
return author==null?Optional.empty():Optional.of(author);
}
Optional<Author> author2 = getAuthor();
author2.ifPresent(s-> System.out.println(s.getName()));
结果:输出“峰哥”两字
2.安全消费
当获到一个Optional对象后需要对其中进行操作,可以通过Optional类中的ifPresent方法来消费其中的值
3.安全获取值
如果期望安全获取值,不推荐使用get,而是使用Optional提供的方法
- 3.1 orElseGet
获取数据并且设置数据为空的默认值,如果不为空则获取其中的数据,如果为空则获取设置的默认数据
public static Optional<Author> getAuthor1(){
Author author = new Author(1,"慕言",25);
return Optional.ofNullable(author);
}
Optional<Author> author1 = getAuthor1();
Author author = author1.orElseGet(() -> new Author());
System.out.println(author.getName());
结果:输出“慕言”两字
- 3.2 orElseThrow
获取数据,如果不为空则获取其中的数据,如果为空则根据传入的数据来创建异常的抛出
public static Optional<Author> getAuthor1(){
Author author = new Author(1,"慕言",25);
return Optional.ofNullable(author);
}
Optional<Author> author1 = getAuthor1();
try {
Author author = author1.orElseThrow( () -> new RuntimeException("数据为空"));
System.out.println(author);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
结果:
4.过滤
可以通过filter方法对数据进行过滤,如果原本有数据,但不满足判断的,则会变成一个无数据的Optional对象
public static void main(String[] args) {
testFilter();
}
private static void testFilter() {
Optional<Author> author1 = getAuthor1();
author1.filter(author -> author.getAge() > 18).ifPresent(author -> System.out.println(author.getName()));
}
public static Optional<Author> getAuthor1(){
Author author = new Author(1,"慕言",25);
return Optional.ofNullable(author);
}
结果:输出“慕言”两字
5.判断
可以通过isPresent判断数据是否存在
public static void main(String[] args) {
testFilter();
}
private static void testFilter() {
Optional<Author> author1 = getAuthor1();
if (author1.isPresent()) {
System.out.println(author1.get().getName());
}
public static Optional<Author> getAuthor1(){
Author author = new Author(1,"慕言",25);
return Optional.ofNullable(author);
}
结果:输出“慕言”两字
总结
1.orElse 和 orElseGet 方法区别:
orElse 方法:无论 value 是否为null,都会执行 orElse 里的方法
orElseGet 方法:只有 value=null 时,才会执行 orElseGet 里的方法
建议平时使用 orElseGet 方法,少用 orElse 方法!
2.map 和 flatMap 方法区别:
map 方法: map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数
程序猿阿杰: 不好意思
deikjet: 第二部分里面好多nacos打成了nocas哈哈哈哈
程序猿阿杰: 是这样的,因为他生成的是一个表对应一个实体类,mapper,xml等
帅大大的架构之路: 大佬,指定table那里,如果要生成几十张表,需要一个个写上去吗
程序猿阿杰: 好好学,这个工作会用到