1。在前言中,相信很多朋友都对java的NPE(NullPointerException)所谓的空指针异常一头雾水。有大佬说“防止NPE是程序员的基本修养”。但是修身归修身,也是我们程序员最头疼的问题之一。2.知道Optional并使用它简单的说,Opitonal类是Java为了解决人们通常使用null!=obj来判断一个对象是否为空而让人头疼导致NPE(NullPointerException)的判断而提供的空指针异常),Optional的存在可以让代码更简单,更易读,写起来更高效。例程判断://objectperson//attributehasname,agePersonperson=newPerson();if(null==person){return"personisnull";}returnperson;使用Optional://objectperson//attribute有个名字,agePersonperson=newPerson();returnOptional.ofNullable(person).orElse("personisnull");测试显示classPerson代码(不明白的可以看看这个):publicclassPerson{privateStringname;私人整数年龄;publicPerson(Stringname,Integerage){this.name=name;这个。年龄=年龄;}publicPerson(){}publicStringgetName(){返回姓名;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){返回年龄;}publicvoidsetAge(Integerage){this.age=age;接下来,让我们高效地了解神奇的Optional类吧!2.1Optional对象的创建首先我们打开Optional的内部一探究竟。首先,提取几个创建Optional对象的方法。publicfinalclassOptional{privatestaticfinalOptional>EMPTY=newOptional<>();私有最终T值;//我们可以看到两个构造方块都是私有的private//说明我们没有方法出去创建一个Optional对象privateOptional(){this.value=null;}privateOptional(Tvalue){this.value=Objects.requireNonNull(value);}//这个静态方法粗略的创建了一个wrapper的对象,因为没有赋参数所以值为空publicstaticOptionalempty(){@SuppressWarnings("unchecked")Optionalt=(Optional)空的;返回吨;}//这个静态方法因为赋值publicstaticOptionalof(Tvalue){returnnewOptional<>(value);粗略的创建了一个非空包装值的对象}//这个静态方法粗略地说,如果参数值为空,则创建一个空对象,如果不为空,则创建一个带参数的对象publicstaticOptionalofNullable(Tvalue){return价值==空?空():(值);}}做一个简单的例子来显示与上面的对应。//1.创建一个Optional对象,其包装对象值为空OptionaloptEmpty=Optional.empty();//2.创建一个Optional对象,其包装对象值不为空OptionaloptOf=Optional.of("optional");//3.创建一个Optional对象,其值可以为空也可以不为空。OptionaloptOfNullable1=Optional.ofNullable(null);OptionaloptOfNullable2=Optional.ofNullable("optional");我们大致分析了创建Optional对象的内部方法。接下来,我们就正式进入Optional的学习和使用。2.2Optional.get()方法(返回对象的值)。publicTget(){if(value==null){thrownewNoSuchElementException("Novaluepresent");}returnvalue;}即值不为空则返回,为空则抛出异常"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("empty");}2.4Optional.ifPresent()方法(判断是否为空返回一个函数)this表示如果对象不为空,运行函数体源码:publicvoidifPresent(Consumerconsumer){//如果value不为空,运行accept方法体if(value!=null)consumer.accept(价值);}看例子:Personperson=newPerson();person.setAge(2);Optional.ofNullable(person).ifPresent(p->System.out.println("age"+p.getAge()));如果对象不为空,就会打印年龄,因为内部已经做了NPE(非空判断),所以不用担心空指针异常2.5Optional.filter()方法(过滤对象)的过滤器()方法大致意思是,接受一个对象,然后对其进行条件过滤,如果满足条件,则返回Optional对象本身,如果不满足,则返回一个空的Optional源代码:publicOptionalfilter(Predicatepredicate){Objects.requireNonNull(predicate);//如果为空,直接返回thisif(!isPresent())returnthis;else//判断return本身是否为空Optionalreturnpredicate.test(value)?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);//如果为空,则返回Selfif(!isPresent())returnempty();else{//否则返回用returnOptional.ofNullable(mapper.apply(value))方法修饰的Optional}}实例显示:Personperson1=newPerson();person.setAge(2);StringoptName=Optional.ofNullable(person).map(p->person.getName()).orElse("nameisempty");2.7Optional.flatMap()方法(Optional对象二次包装)map()方法会对应Optional功能接口中的对象,进行二次操作,封装成一个新的对象,然后返回源码在可选:publicOptionalflatMap(Function>mapper){Objects.requireNonNull(mapper);如果(!isPresent())返回空();else{returnObjects.requireNonNull(mapper.apply(value));}}例如:Personperson=newPerson();person.setAge(2);Optional