1。前言相信很多朋友都对java的NPE(NullPointerException)所谓的空指针异常一头雾水。有大佬说“防止NPE,是程序员的基本素养。》但是修身就是修身,这也是我们程序员最头疼的问题之一,所以今天要尽可能的利用Java8的新特性Optional,尽可能的简化代码,高效的处理NPE(NullPointerException)2.理解Optional和use简单的说,Opitonal类是Java为了解决人们通常使用null!=obj来判断一个对象是否为空而让人头疼导致NPE(NullPointerException).,同时Optional的存在可以让代码更简单,更易读,写起来更高效。常规判断://objectperson//属性有名字,agePersonperson=newPerson();if(null==person){return"personisnull";}returnperson;UseOptional://objectperson//propertyhasname,agePersonperson=newPerson();returnOptional.ofNullable(person).orElse("personisnull");测试显示类Person代码(如果你有不了解的朋友明白了,你可以看看这个):(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}}接下来,让我们高效学习一下神奇的Optional类吧!2.1先创建Optional对象我们先打开Optional的内部,一探究竟,先抽取几个创建Optional对象的方法publicfinalclassOptional{privatestaticfinalOptional>EMPTY=newOptional<>();privatefinalTvalue;//我们可以看出两个构造方块都是privateprivate//表示我们不能出去创建一个Optional对象privateOptional(){this.value=null;}privateOptional(Tvalue){this.value=Objects.requireNonNull(value);}//这个静态方法粗略的创建了一个空包装值的对象,因为没有参数赋值publicstaticOptionalempty(){@SuppressWarnings("unchecked")Optionalt=(Optional)EMPTY;returnt;}//这个静态方法粗略的创建了一个非空包装值的对象,因为赋值publicstaticOptionalof(Tvalue){returnnewOptional<>(value);}//这个静态方法粗略的说如果参数值为空就创建一个空对象,如果不为空就创建一个带参数的对象publicstaticOptionalofNullable(Tvalue){returnvalue==null?empty():of(value);}}做一个简单的例子来说明上面的对应//1,创建一个包装对象whose值为空OptionalobjectOptionaloptEmpty=Optional.empty();//2.创建一个Optional对象,其包装对象值不为空OptionaloptOf=Optional.of("optional");//3.创建一个包装对象值Optional对象,允许为空或不为空。OptionaloptOfNullable1=Optional.ofNullable(null);OptionaloptOfNullable2=Ooptional.ofNullable("可选");我们大致分析了创建Optional对象的内部方法,然后正式进入Optional的学习和使用更多Java面试技术要点,在Java知音回复“面试题汇总”公众号2.2Optional.get()方法(返回对象的值)get()方法返回一个option的实例值源码:publicTget(){if(value==null){thrownewNoSuchElementException("Novaluepresent");}returnvalue;}即如果value不为空则返回,为空则抛出异常"Novaluepresent"一个简单的例子说明Personperson=newPerson();person.setAge(2);Optional.ofNullable(person).get();2.3Optional.isPresent()方法(判断是否为空)isPresent()方法会返回一个boolean类型值,如果对象不为空则为True,为空则为false源代码:publicBooleanisPresent(){returnvalue!=null;}简单示例展示:Personperson=newPerson();person.setAge(2);if(Optional.ofNullable(person).isPresent()){//写非空逻辑System.out.println("notempty");}else{//写空逻辑System.out.println("isempty");}2.4Optional.ifPresent()方法(判断是否为空返回函数)意思是如果对象不为空,则运行函数体源码:publicvoidifPresent(Consumerconsumer){//如果value不为空,则运行accept方法体if(value!=null)consumer.accept(value);}看例子:Personperson=newPerson();person.setAge(2);Optional.ofNullable(person).ifPresent(p->System.out.println("年龄"+p.getAge()));如果对象不为空,则会打印age,因为内部已经做了NPE(非空判断),所以不用担心空指针异常扩展知识点:熟练使用Java8中的Stream,让集合操作飞起来!2.5Optional.filter()方法(过滤对象)filter()方法大致意思是接受一个对象,然后有条件地过滤它,如果满足条件,则返回Optional对象本身,如果不满足,则返回一个空的Optional源码:publicOptionalfilter(Predicatepredicate){Objects.requireNonNull(predicate);//如果为空,直接返回thisif(!isPresent())returnthis;else//判断return本身是否为空可选的returnpredicate.test(值)?this:empty();}简单的例子:Personperson=newPerson();person.setAge(2);Optional.ofNullable(person).filter(p->p.getAge()>50);2.6Optional.map()方法(对象的二次封装)map()方法会对应Functional接口中的对象,进行二次操作,封装成一个新的对象,然后返回给Optional源码:publicOptionalmap(Functionmapper){Objects.requireNonNull(mapper);//如果为空则自己返回if(!isPresent())returnempty();else{//否则返回OptionalreturnOptional。ofNullable(mapper.apply(value));}}示例显示:Personperson1=newPerson();person.setAge(2);StringoptName=Optional.ofNullable(person).map(p->person.getName()).orElse("名称为空");2.7Optional.flatMap()方法(二次包装的Optional对象)map()方法会对应Optionalfunctional接口中的对象进行二次操作,封装成一个新的对象返回给Optional源码:publicOptionalflatMap(Function>mapper){Objects.requireNonNull(mapper);if(!isPresent())returnempty();else{returnObjects.requireNonNull(mapper.apply(value));}}示例:Personperson=newPerson();person.setAge(2);Optional