Optional類の判空操作--見ると


文書ディレクトリ
  • 1、Optionalクラスの基本使用
  • 2、実用
  • 3、mapとflatMapの違い
  • 4、思考
  • 開発過程では,しばしば空判定に遭遇し,処理しなければ異常が発生する可能性が高い.しかし、行われる判定コードは冗長であり、カスケード判定が発生するとコードがあまり優雅ではない場合がある.jdk 8のOptionalクラスでは、空のポインタ異常の新規クラスが処理されています.
    Optionalクラスはnullまたはnull以外のオブジェクトを格納できるコンテナとして理解できます.
    1、Optional類の基本使用
    //  2     ,    null,   null
    Student student1 = new Student();
    student1.setAge("26");
    student1.setCity("wuhan");
    student1.setSName("qsm");
    
    Student student2 = null;
    
    //  Optional   
    Optional<Student> optionalStudent1 = Optional.of(student1);
    //Optional optionalStudent1 = Optional.of(student2); //  :java.lang.NullPointerException
    Optional<Student> optionalStudent2 = Optional.ofNullable(student2);//Optional.empty
    
    //    
    System.out.println(optionalStudent1.get());//Student(sName=qsm, identityNum=null, age=26, city=wuhan)
    //System.out.println(optionalStudent2.get());//  :java.util.NoSuchElementException: No value present
    
    //            
    //orElse              ;orElseGet  ,              ;orElseThrow,        
    System.out.println(optionalStudent1.orElse(new Student()));//Student(sName=qsm, identityNum=null, age=26, city=wuhan)
    System.out.println(optionalStudent2.orElse(new Student("hn")));//Student(sName=hn, identityNum=null, age=null, city=null)
    
    System.out.println(optionalStudent1.orElseGet(new Supplier<Student>() {
        @Override
        public Student get() {
            return new Student("liuqiangdong");
        }
    }));//Student(sName=qsm, identityNum=null, age=26, city=wuhan)         lambda  
    System.out.println(optionalStudent1.orElseGet(() -> new Student("liuqiangdong")));//Student(sName=qsm, identityNum=null, age=26, city=wuhan)
    System.out.println(optionalStudent2.orElseGet(() -> new Student("mayun")));//Student(sName=mayun, identityNum=null, age=null, city=null)
    
    System.out.println(optionalStudent1.orElseThrow(BizException::new));//Student(sName=qsm, identityNum=null, age=26, city=wuhan)
    System.out.println(optionalStudent1.orElseThrow(()-> new BizException("3000","    null")));//Student(sName=qsm, identityNum=null, age=26, city=wuhan)
    //System.out.println(optionalStudent2.orElseThrow(BizException::new));//Exception in thread "main" com.jd.ins.qsm.demo.web.commom.excption.BizException
    
    // filter()  map()
    Student student3 = new Student();
    student3.setAge("18");
    student3.setCity("beijing");
    student3.setSName("hn");
    
    List<Student> studentList = Lists.newArrayList();
    studentList.add(student1);
    studentList.add(student3);
    
    // filter(),   Optional                Optional   ,      Optional  
    Optional<List<Student>> optionalStudentList1 = Optional.ofNullable(studentList);
    System.out.println(optionalStudentList1.filter(tempOptionalStudentList -> tempOptionalStudentList.size() > 1).orElse(Lists.newArrayList()));
    //[Student(sName=qsm, identityNum=null, age=26, city=wuhan), Student(sName=hn, identityNum=null, age=18, city=beijing)]
    Optional<List<Student>> optionalStudentList2 = Optional.ofNullable(null);
    System.out.println(optionalStudentList2.filter(tempOptionalStudentList -> tempOptionalStudentList.size() > 1).orElse(Lists.newArrayList()));//[]
    
    //map(),   Optional      ,   mapper     ,         optional  ,      Optional  
    Optional<List<Student>> students = optionalStudentList1.map(tempOptionalStudentList -> {
        for (Student student : tempOptionalStudentList) {
            student.setAge("99");
        }
        return tempOptionalStudentList;
    });
    System.out.println(students.get());//[Student(sName=qsm, identityNum=null, age=99, city=wuhan), Student(sName=hn, identityNum=null, age=99, city=beijing)]
    System.out.println(optionalStudent1.map(student -> student.getAge()).get());//99
    
    
    //    ifPresent
    optionalStudent1.ifPresent(new Consumer<Student>() {
        @Override
        public void accept(Student student) {
            student.setIdentityNum("1234");
        }
    });
    System.out.println(optionalStudent1.get());//Student(sName=qsm, identityNum=1234, age=99, city=wuhan)
    optionalStudent2.ifPresent(student -> student.setIdentityNum("456"));//    
    //System.out.println(optionalStudent2.get());//java.util.NoSuchElementException: No value present
    

    2、実際に使う
    実際の開発では、2つの状況によく遭遇します.1つ目は、カスケード判定が頻繁に発生することです.2番目のフィールドに値がある必要があります.そうしないと、エラーを報告する必要があります.次の例では、先生クラスにアドレスクラスのフィールドがあります.
    private static void compare() throws Throwable {
    
    Address address = new Address();
    address.setCity("wuhan");
    
    Teacher1 teacher1 = new Teacher1();
    teacher1.setTName("qsm  ");
    teacher1.setAddress(address);
    
    //       
    if (ObjectUtils.isNotEmpty(teacher1) && ObjectUtils.isNotEmpty(teacher1.getAddress())) {
        System.out.println(teacher1.getAddress().getCity());//wuhan
    }
    
    //  Optional
    //     ,     
    Optional.ofNullable(teacher1).map(Teacher1::getAddress).map(Address::getCity).orElse(null);//wuhan
    //Optional.ofNullable(teacher1).map(tempTeacher -> tempTeacher.getAddress()).map(tempAddress -> tempAddress.getCity()).orElse(null);
    
    
    //            ,        
    //    
    if (ObjectUtils.isEmpty(teacher1) || ObjectUtils.isEmpty(teacher1.getAddress()) || ObjectUtils.isEmpty(teacher1.getAddress().getProvince())) {
        throw new BizException("32", "     ");
    }
    
    Optional.ofNullable(teacher1).map(Teacher1::getAddress).map(Address::getProvince).orElseThrow(() -> new BizException("32", "     "));
    //com.jd.ins.qsm.demo.web.commom.excption.BizException:      
    }
    

    3、mapとflatMapの違い
    簡単に言えば、mapの戻り値は自動的にOptionalオブジェクトとしてパッケージされます.flatMapは手動でカプセル化する必要があります.具体的にはJDK 8のOptionalクラスのmapメソッドとflatMapメソッドの違いを参照してください
    4、考える
    Optionalは空ポインタ異常の問題を効果的に解決できる.
    また,1つ目はコード量が効果的に減少していないこと,2つ目はnullの判定空であり,文字列の空文字,集合の空要素などに対して最適化が必要であることに注意する必要がある.
    全体的にOptionalは補助手段としてコードの記述を行うことができる.
    BATに行く途中修行中!!