JAVA8-Java8的流式编程-Optional的使用

本文最后更新于:September 2, 2022 pm

JAVA8 是一个有里程碑的一个版本,提供了很多的新特性。Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。

目录

创建对象

判空处理

当被判断的值为null时,并不会进行报错处理。

1
2
3
4
5
6
Optional<Integer> integer = Optional.ofNullable(13);
Integer res = integer.get();

// 为null
Optional<Integer> integer = Optional.ofNullable(null);
Integer res = integer.get(); // 获取时报错

为空设置默认值

当被判断值为空时,可以给值设置为一个默认值。

1
2
Integer integer = Optional.ofNullable(13).orElse(7); // 13
Integer o = (Integer) Optional.ofNullable(null).orElse(7); // 7

当确定某一个对象不是空时,可以使用Optional的静态方法of来把数据封装成Optional对象。

1
2
Optional<Stu> s11 = Optional.of(s1); // s1非null
System.out.println(s11.get());

⚠️注意:使用此方法,必须确定传入的对象非空!!!

封装空对象为Optional。如果某对象为空,可以使用Optional的静态方法empty来进行封装成Optional对象。

1
Optional<Object> empty = Optional.empty();

判断是否有值

与之相关的有两个方法,一个是判断是否有值;另一个是如果有值的话需要干什么(Consumer)。

1
2
3
Optional<Stu> o = Optional.ofNullable(s1);
boolean present = o.isPresent(); // 判断是否有值
o.ifPresent(it->System.out.println(it.getName()));// 如果有值,需要做什么

获取值

分为不安全获取,即如果对象为空,那么获取时,会抛出异常;安全获取,即在对象为空时,可以自定义的操作。

不安全获取

1
2
Optional<Stu> o = Optional.ofNullable(null);
System.out.println(o.get());

抛出异常:

1
Exception in thread "main" java.util.NoSuchElementException: No value present

安全获取

有三种方式:orElse()、orElseGet()、orElseThrow()。

orElse:当数据为空,则为其赋值一个默认值。

1
2
Integer o = Optional.ofNullable(13).orElse(7); // 13
Integer o = (Integer) Optional.ofNullable(null).orElse(7); // 7

orElseGet:当数据不为空才进行获取值的操作。如果为空则根据传入的参数来创建对象作为默认值返回。

1
2
Stu ttf = Optional.ofNullable(s1).orElseGet(() -> new Stu("ttf", 7, 13, 23.3));
Stu ttf = (Stu) Optional.ofNullable(null).orElseGet(() -> new Stu("ttf", 7, 13, 23.3)); // 返回创建的默认值

orElseThrow:如果数据不为空,则获取该数据;如果为空,则抛出自定义异常。

1
Stu stu = Optional.ofNullable(s1).orElseThrow(() -> new RuntimeException());

过滤

使用filter方法对数据进行过滤处理,如果原本有数据,但是不符合条件的,会变成一个无数据的Optional对象。

1
Optional<Stu> stu = Optional.ofNullable(s1).filter(it -> it.getAge() < 23);

转换

map方法可以让我们对数据进行转换,并且转换得到的数据也还是被Optional包装好的,保证了我们的使用安全。

1
2
3
Optional<Stu> s11 = Optional.ofNullable(s1);
Optional<String> s = s11.map(Stu::getName);
System.out.println(s.get());