新郑网站开发,深圳门户网站制作,制定 网站改版优化方案,长沙市在建工程项目Optional使用详解 文章目录Optional使用详解1.构造函数2.Optional.of(T value)作用使用源码#xff08;只想知道怎么用的可以略过#xff09;Optional.ofNullable(T value)作用使用源码.orElse(T other)作用使用源码.orElseGet(Supplier? extends T other)作用使用源…Optional使用详解 文章目录Optional使用详解1.构造函数2.Optional.of(T value)作用使用源码只想知道怎么用的可以略过Optional.ofNullable(T value)作用使用源码.orElse(T other)作用使用源码.orElseGet(Supplier? extends T other)作用使用源码.map(Function? super T, ? extends U mapper)作用使用源码isPresent()作用使用源码ifPresent(Consumer? super T consumer)作用使用源码filter(Predicate? super T predicate)为了防止空指针报错NullPointerException一我们都会加上ifelse想让代码变得更优雅JAVA8提供了Optional类来优化这种写法1.构造函数
构造函数使用private修饰不能直接被外部访问没办法new出来Optional的本质就是内部储存了一个真实的值在构造的时候就直接判断其值是否为空。下面为源码
/*** Constructs an instance with the value present.** param value the non-null value to be present* throws NullPointerException if value is null*/private Optional(T value) {this.value Objects.requireNonNull(value);}//requireNonNull()方法public static T T requireNonNull(T obj) {//使用构造函数创建对象value为null则报空指针if (obj null)throw new NullPointerException();return obj;}2.Optional.of(T value)
一般推荐使用Optional.ofNullable(T value)在实际生产中很少使用of()方法因为使用of()方法value为null时会报出空指针。不过已有一些场景会用到比如一些需要空指针暴露的接口或测试类中。
作用
当value值为空时依然会报NullPointerException。当value值不为空时能正常构造Optional对象。
使用
//1.当 strnull报空指针
String str null;
OptionalString str1 Optional.of(str);源码只想知道怎么用的可以略过 public static T OptionalT of(T value) {//构造函数创建对象return new Optional(value);}//构造函数private Optional(T value) {this.value Objects.requireNonNull(value);}//requireNonNull()方法public static T T requireNonNull(T obj) {//若传入的value为null则报空指针if (obj null)throw new NullPointerException();return obj;}
Optional.ofNullable(T value)
与of(T value)最大的区别就是value可以为空推荐使用
作用
当value值为空时不会报空指针。当value值不为空时能正常构造Optional对象。
使用
String str null;
//str为空时不会报空指针
OptionalString str2 Optional.ofNullable(str);源码 public static T OptionalT ofNullable(T value) {//value为null时执行empty()方法return value null ? empty() : of(value);}public staticT OptionalT empty() {SuppressWarnings(unchecked)//返回EMPTY对象OptionalT t (OptionalT) EMPTY;return t;}// EMPTY对象化就是new Optionalprivate static final Optional? EMPTY new Optional(); .orElse(T other)
作用
如果有值则将其返回否则返回指定的other对象。
传入的值为null时执行other并返回传入的值不为null时执行other返回传入的值
使用
执行以下代码控制台输出Hello被执行了可见传入的vaule不为null但是t.rousHello()依然执行。 public String rousHello() {System.out.println(Hello被执行了);return Hello!!!;} public static void main(String[] args) {test1 tnew test1();String s Optional.ofNullable(Str).orElse(t.rousHello());}源码 public T orElse(T other) {//value为ofNullable(T vaule)的valuevaule不为空返回balue否则执行otherreturn value ! null ? value : other;}
.orElseGet(Supplier? extends T other)
比较推荐使用
作用 orElse()一定会被执行而orElseGet()只有传入的参数为null时才会被执行 只有传入的参数为null情况才才会执行orElseGet()内容
使用 public String rousHello() {System.out.println(Hello被执行了);return Hello!!!;}
String s Optional.ofNullable(str).orElseGet(() - t.rousHello());源码 public T orElseGet(Supplier? extends T other) {return value ! null ? value : other.get();}.map(Function? super T, ? extends U mapper)
作用
不会返回空指针的获取对象属性
使用 //例如User中有个Address属性Address对象中有详细地址
public String getCity(User user) throws Exception{return Optional.ofNullable(user).map(u- u.getAddress()).map(a-a.getCity()).orElseThrow(()-new Exception(获取用户地址失败));
}源码 publicU OptionalU map(Function? super T, ? extends U mapper) {//1.为空则报空指针错误前面讲过Objects.requireNonNull(mapper);//不存在返回EMPTY对象前面讲过if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}}//requireNonNull()方法public static T T requireNonNull(T obj) {//若传入的value为null则报空指针if (obj null)throw new NullPointerException();return obj;}isPresent()
作用
判断是否存在.不存在返回false存在返回true
使用
boolean present Optional.ofNullable(user).isPresent();源码
源码很容易理解直接判断value是否!null public boolean isPresent() {return value ! null;}ifPresent(Consumer? super T consumer)
作用
如果存在则往下走
使用
//如果user存在则覆盖user的age和name属性
Optional.ofNullable(user).ifPresent(u-{u.setAge(100);u.setName(ifPresent);});源码 public void ifPresent(Consumer? super T consumer) {if (value ! null)consumer.accept(value);}filter(Predicate? super T predicate)
作用
如果值存在并且这个值匹配给定的 predicate返回一个Optional用以描述这个值否则返回一个空的Optional。
使用 user.setName(张四);//此处会报空指针因为get()方法在value为null的情况下会报空指针User user1 Optional.ofNullable(user).filter(u - u.getName() 张三).get();OptionalUser user2 Optional.ofNullable(user).filter(u - u.getName() 张三);user2.ifPresent(u-u.setAge(99));源码 public OptionalT filter(Predicate? super T predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();}