2017-12-15 26 views
3

내가 선택적 개체를 사용하여 아래의 코드 (나는 jpaConnector을 제어하지 않음) 다시 할 : 나는 지금까지이 achievied 한재 작성 서비스 요청을 사용하여 선택적 항목

public boolean deleteLockStatus() { 

    IMdss service = jpaConnector.getMdssService(); 
    if (service == null) { 
     return false; 
    } 

    ServiceResponse response = null; 
    try { 
     response = service.deleteLockStatus(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    if (response == null) { 
     return false; 
    } 
    if (response.isError()) { 
     return false; 
    } 
    return true; 
} 

:

public boolean deleteLockStatus() { 

    Optional<IMdss> service = Optional.ofNullable(jpaConnector.getMdssService()); 

    if (!service.isPresent()) { return false; } 


    Optional<ServiceResponse> response = Optional.empty(); 
    try { 
     response = Optional.ofNullable(service.get().deleteLockStatus()); 
     if (response.isPresent() == false || response.get().isError()) { 
      return false; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 

    return true; 
} 

이 더 나은가요 및 더 많은 네이티브 자바 8 방법? 고맙습니다!!!

답변

4

우리는 Optional<Service>로 시작, (우리에게 Optional<Optional<ServiceResponse>>를 줄 것이다 일반지도 기능 사용) Optional<ServiceResponse>에, 다음 Optional<Boolean>에 그지도를하는 것이 평면지도.

Optional<Boolean>은 응답의 성공 또는 실패를 나타냅니다. 여기에 값이 없으면 예외가 발생하여 orElse(false)과 false를 반환합니다.

확인 된 예외와 스택 추적을 인쇄해야하는 것이 유감입니다. 그렇지 않으면 훨씬 더 간결해질 수 있습니다.

public boolean deleteLockStatus() { 
    return Optional.ofNullable(jpaConnector.getMdssService()) 
     .flatMap(service -> { 
      try { 
       return Optional.ofNullable(service.deleteLockStatus()); 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
       return Optional.empty(); 
      } 
     }) 
     .map(ServiceResponse::isError) 
     .orElse(false); 
} 

사이드 노트 : catching Exception is usually a bad idea. 당신은 가능한 구체적이어야합니다. 발생할 가능성이있는 예외가 여러 개인 경우 this syntax을 사용하십시오. 당신이 null를 사용 괜찮다면

Federico에 의해 코멘트에서 언급 한 바와 같이

,이 약간의 단순화로 flatMap를 교체 할 수 있습니다. 위의 버전을 개인적으로 선호합니다.

.map(service -> { 
    try { 
     return service.deleteLockStatus(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
}) 
+0

감사합니다. 1 분 O.O ... 나는 stackTrace를 인쇄 할 필요가 없지만 예외를 처리해야합니다 ...하지만 나는 한 줄만 저장합니다.? – Shakka

+1

@Shakka'flatMap' 람다의 내용을 자신의 함수로 옮긴 다음 메소드 참조로 바꾸는 것을 고려해 볼 수 있습니다.하지만 좀 더 가독성이 있는지를 결정하는 것은 당신에게 달려 있습니다. – Michael

+0

작은 오류가 수정되었습니다. 마지막 괄호는 세미콜론이어야합니다 – Shakka