자바 팁:자바 8 optional 클래스 사용

14299 단어 Java
1.문제 와 수요
먼저 간단 한 종 류 를 보 겠 습 니 다.
class Person{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

우리 가getName를 호출 하여 name 을 가 져 올 때 값 이 비어 있 을 수 있 습 니 다.그러면 다음 과 같은 코드 가 나타 납 니 다.
Person p = getPerson();
if(p.getName() != null){
    //do something...
}
//  
if(Person.isNameNotEmpty(p)){
    //do something...
}

여기에 두 가지 문제 가 있 을 것 이다.
  • 코드 가 조금 많 고 치밀 하지 않다.
  • 서명 방법 만 보고 비 어 있 는 지 직접 판단 할 수 없고 String|null 과 같은 유형 을 표시 할 수 없습니다.

  • 우리 의 요 구 는:
  • 빈 판단 을 우아 하 게 처리 합 니 다.
  • 방법 서명 에서 이 방법의 반환 값 이 존재 하지 않 을 수도 있 음 을 알 수 있다.

  • 2.선택 클래스 소개java.util.Optional류 는 자바 8 이 도입 한 도구 류 로'선택 가능 한'의 미 를 나타 내 며 단일 대상 의 포장 용기 로 서 일련의 방법 을 제공 하여 빈 판단 과 후속 작업 을 우아 하 게 처리 할 수 있다.
    우선 optional 대상 만 들 기:
    Optional<T> opt = Optional.empty();           //  Optional
    Optional<T> opt1 = Optional.of(value);         //     Optional,   value   null,     
    Optional<T> opt2 = Optional.ofNullable(value); //            Optional
    

    공백 여 부 를 판단 합 니 다:
    opt.isEmpty();
    opt.isPresent();
    

    공백 을 판정 하고 해당 동작 을 수행 합 니 다:
    opt.ifPresent(s -> { //if...
        //     ,do something...
    });
    
    opt.ifPresentOrElse(s -> { //if...else...
        //     ,do something...
    }, () -> {
        //      ,do something...
    });
    

    optional 에서 값 가 져 오기:
    opt.get();                              //        
    opt.orElse(defValue);                   //         
    opt.orElseGet(() -> getDefXXXValue());  //          
    opt.orElseThrow();                      //        ,  get
    opt.orElseThrow(() -> new IllegalStateException("xxx"));//        
    

    체인 호출:
    int value = opt
                    .filter(s -> s.length() > 0)                    //      0     
                    .or(() -> Optional.of("empty"))                 //       "empty"
                    .map(s -> "str:" + s)                           //    
                    .flatMap(s -> {                                 //    
                        try{
                            return Optional.of(Integer.parseInt(s));
                        } catch (NumberFormatException e) {
                            return Optional.empty();
                        }
                    })
                    .orElse(0);                                     //       
    

    흐름 대상 으로 전환:
    Stream<T> stream = opt.stream();
    //      Stream API   Optional    。
    

    마지막 으로 우 리 는 optional 로 맨 위의 예 를 수정 할 수 있다.
    class Person {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        //                       
        public Optional<String> optName() { 
            return Optional.ofNullable(name);
        }
    }
    

    좋은 웹페이지 즐겨찾기