Java-Optional类型
文章目录
前言
在我们开发的过程中一不小心就会写下bug造成空指针异常,是不是很头痛呢。而Optional 类的引入可以很好的解决空指针异常,Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
一、如何使用Optional?
使用optional的关键在于在值不存在的情况下产出一个可替代物,而只有在值存在情况下才会使用这个值。
如下示例会res为demo会打印出他的值“demo”,resEmpty为null值,会打印出设置的默认值“default”
Optional<String> optional = Optional.of("demo");
Optional<String> optionalEmpty = Optional.empty();
//optional存在就返回optional的值否值就返回默认值
String res =optional.orElse("default");
String resEmpty =optionalEmpty.orElse("default");
System.out.println(res);
System.out.println(resEmpty);

还可以通过以下方式设置默认值和在为空的情况抛出异常
//通过调用代码来计算默认值
String result =optionalEmpty.orElseGet(()->Locale.getDefault().getDisplayName());
//在没有值的情况下抛出异常
String result2 =optionalEmpty.orElseThrow(IllegalAccessError::new);
二、不合适使用optional值的方式
参考以下代码你感觉哪个更简洁一些呢,结果很明显
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class StreamTest {
public static void main(String[] args){
List<StreamTest> testList =Arrays.asList(new StreamTest(), null);
for (StreamTest test : testList) {
//直接判断是否为空
if(test!=null){
test.hello();
}
//使用optional包装在判断
if(Optional.ofNullable(test).isPresent()){
Optional.of(test).get().hello();
}
}
}
public void hello(){
System.out.println("hello word ");
}
}
三、Optional的创建
可以使用Optional.of()和Optional.empty()方法来创建Option对象,使用of方法传入null会报NullPointerException异常,可以使用Optional.ofNullable()方法,他会判断传入的是否为null,如果为null则会调用Optional.empty()方法,否则调用Optional.of()
Optional<String> s = Optional.of("wawa");
Optional<String> s1 = Optional.empty();
Optional<String> s2= Optional.ofNullable(null);
四、ifPresent的使用
ifPresent方法会接受一个函数,如果值存在那么他会被传递给该函数,否值不会发生任何事情
如下示例第一个foreach打印的结果为smailnullnullSky,而第二个使用ifPresent打印的结果为smailSky
List<String> words = Arrays.asList("smail",null,null,"Sky");
//ifPresent方法会接受一个函数,如果值存在那么他会被传递给该函数,否值不会发生任何事情
words.forEach(System.out::print);
System.out.println();
words.forEach(x->Optional.ofNullable(x).ifPresent(System.out::print));

五、使用flatMap来构建Optional值的函数
该类中有一个inverse方法获取某个数的倒数,squareRoot获取某个值的平方根,以下展示普通的求一个数的倒数的平方根和使用flapMap的两种方法
import java.util.Optional;
public class StreamTest {
public static void main(String[] args){
//求一个值的倒数的平方根
// 正常情况下我们先调用inverse方法获取倒数
Optional<Double> inverse = StreamTest.inverse(2.0);
Optional<Double> squareRoot = StreamTest.squareRoot(inverse.get());
System.out.println(squareRoot.get());
//通过使用flatMap我们可以直接
Optional<Double> result = StreamTest.inverse(2.0).flatMap(StreamTest::squareRoot);
System.out.println(result.get());
}
/**
* 获取值的倒数
* @param x 值
* @return 倒数
*/
public static Optional<Double> inverse(Double x) {
return x == 0 ? Optional.empty() : Optional.of(1 / x);
}
/**
* 获取x的平方
* @param x 值
* @return 倒数
*/
public static Optional<Double> squareRoot(Double x) {
return x == 0 ? Optional.empty() : Optional.of(Math.sqrt(x));
}
}
版权声明:本文为s13073660520原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。