Optional
java开发中我们最常见的异常大概就是空指针异常NullPointerException。
出现空指针异常的情况:
- 空对象调用方法,示例:
private static void test1(List<Apple> appleList){
Apple apple = appleList.get(0);
System.out.println(apple.toString());
}
此时appleList作为参数传递过来的,如果不判断是不是null,直接调用方法就会出现空指针异常
- 拆箱导致,示例:
private static void test(Integer id){
OptionalBean optionalBean = new OptionalBean(id,"demo");
int id = optionalBean.getId();
System.out.println(id);
}
此时OptionalBean有两个属性一个是id,类型是int,一个是name,类型是String,此时id作为参数传递过来,如果不判空,直接用来创建对象,那么如果id为null,那么也会出现空指针。
为了避免空指针,我们必须做很多的判空操作,比如:
//有工具类判空
StringUtils.isBlank();
StringUtils.isNoneBlank();
CollectionUtils.isEmpty();
//条件语句判空
if(null != a){...}
if("" != a){...}
那么null会带来哪些问题呢?
- 最典型的抛空指针异常,可能阻断程序执行
- 代码膨胀,到处需要判空操作
注意这些方法Optional调用的时候,如果值不存在,返回的不是null,而是空的Optional对象,所以调用方法时不需要刻意判空。
Optional对象
创建一个空Optional
Optional.empty()
创建非空Optional
Optional.of(Apple apple)
若apple为null,那么本行就会抛异常空指针异常
创建参数可以为null的Optional
Optional.ofNullable(Apple apple)
此方法参数可以传null,如果参数为null,返回的结果是空的Optional。
方法使用示例:
Trader trader1 = new Trader("Tom", "纽约", new Transaction(1200000, new Date()));
Trader trader2 = new Trader("Jul", "北京", new Transaction(1000000, new Date()));
List<Trader> traderList = new ArrayList<>();
traderList.add(trader1);
traderList.add(trader2);
Optional.of(traderList)
.filter(traders -> traders.size()> 0)
.ifPresent(traders -> System.out.println(traders.get(0).getName()));
结果:
Tom
filter()的参数谓词,即返回结果为boolean代码块;
ifPresent()的参数Consumer,即有一个参数无返回值,调用此方法表示如果只存在执行此方法,否则不进行其他操作。
Apple apple = new Apple("red", 120, "富士");
Optional<Apple> apple1 = Optional.ofNullable(apple);
Integer integer = apple1.map(Apple::getWeight)
.orElse(0);
System.out.println("苹果的重量:"+ integer +"克");
结果:
苹果的重量:120克
map()方法获取对象中的值,还有一个flatMap(),使用方式与Stream中的方法相同。
orElse()方法类似条件语句中的else,如果对象为空,那么就返回默认值。