2016-09-23 2 views
4

내 문제 2 가지 이상의 Optionals가 다른 유형으로 포장되어 있습니다. 모든 선택 사항이 비어 있지 않은 경우에만 수행 할 수있는 작업을 수행하려고합니다.조건부 AND로 Java 8 옵션 합치기

현재 필자는이 방법을 수행하십시오 경우 상태를 잘 생각하지 않는 제 생각에는

Optional<PatientCase> caseOptional = patientCaseRepository.findOneById(caseId); 
    Optional<User> userOptional = userRepository.findOneById(caseId); 

    if(userOptional.isPresent() && caseOptional.isPresent()) { 
     caseOptional.get().getProcess().setDesigner(userOptional.get()); 
    } 

. orElse를 사용하여 Optionals를 연결할 수 있다는 것을 알고 있습니다. 하지만 제 경우에는 논리적 인 Else를 원하지 않습니다. 이 PSEUDO 코드와 유사한 두 개 이상의 Optionals 을 결합하기 위해 AND 연산자를 생성 할 수 있습니까?

caseOptional.and.userOptional.ifPresent((theCase,user) -> //Perform Stuff); 

답변

5

논리 AND 운전가 존재하지만, 2 치 Optional로 돌려 할 (단순) 방법이 (다시) 쌍 또는 튜플 유형의 부재 앓고 말해서 없다. 예 : 스탠드에없는 튜플 유형으로 AbstractMap.SimpleEntry를 사용

caseOptional.flatMap(theCase -> userOptional 
     .map(user -> new AbstractMap.SimpleEntry<>(theCase, user))) 
    .ifPresent(e -> e.getKey().getProcess().setDesigner(e.getValue())); 

.

대체하고자 할 쌍으로 싱글 맵을 사용하여 수 :

caseOptional.flatMap(theCase -> userOptional 
     .map(user -> Collections.singletonMap(theCase, user))) 
    .ifPresent(m -> m.forEach((c, u) -> c.getProcess().setDesigner(u))); 

그러나이 특정한 경우에, 당신은 간단

caseOptional.map(PatientCase::getProcess) 
      .ifPresent(p -> userOptional.ifPresent(p::setDesigner)); 

또는

caseOptional.ifPresent(c -> userOptional.ifPresent(u -> c.getProcess().setDesigner(u))); 

대신 사용할 수 있습니다

.

+0

마지막 형태는 어쩌면이 주어진 예/제안 하나 : –

+0

들으로 공식화 될 수있다, 모나드처럼 많이 보인다. 첫 번째 두 개는 두 개만 작동하며 두 개 이상은 작동하지 않는 것으로 보입니다. 나는 더 많은 것들이 optionals을 보유하고있는 커스텀 객체를 사용하여 달성 될 수 있다고 생각한다. 그러나 이것은 더 큰 오버 헤드입니다. 마지막 두 가지 제안은 중첩 된 방식으로 ifPresent를 사용하여 여러 옵션을 연결할 수 있음을 보여줍니다. 그래서 그것은 주어진 문제에 대한 해결책이지만 불행히도 추가 된 옵션마다 코드의 가독성이 떨어집니다. 누군가가 더 나은 가독성을 가진 다른 방법을 찾으면 조금 기다릴 것입니다. 그렇지 않으면 이것을 대답으로 받아 들일 것입니다. – TardigradeX

2

직접적인 방법은 없습니다.

STRAM allMatch 많은 선택적 항목에 대한 ifPresent처럼 작동합니다

Stream.of(optional1, optional2, ...).allMatch(Optional::isPresent) 
+0

이 기술을 사용하여 모든 선택 사항이 있는지 확인할 수 있습니다. 그러나 추가 함수 호출을 연결할 수는 없습니다. 이 단계는 다시 if 절을 사용하여 제어해야하며 나중에 이러한 선택 사항의 포장을 풀어야합니다. 그러나 코딩 오버 헤드는 두 개 이상의 선택 사항을 올바른 방향으로 유효성을 검사 할 때 조금 더 작습니다. – TardigradeX