2017-11-03 3 views
1

rxjava2에서 flowable이 조건부 행동으로 이어지는 경우를 처리하기 위해 권장되는 방법을 찾고 있습니다. 그렇지 나는 새로운 String을 만들고 데이터베이스에 저장하려면 존재 않을 경우rxjava2 - 어쩌면 다른 사람이

보다 구체적으로, 나는 String이있는 경우 Maybe<String>가있는 나는 데이터베이스에 String를 업데이트 할 사항이 있거나.

나는 아래 생각하지만 분명히 내가 무엇을 찾고되지 않습니다 :

Maybe<String> source = Maybe.just(new String("foo")); //oversimplified source 
source.switchIfEmpty(Maybe.just(new String("bar"))).subscribe(result -> 
System.out.println("save to database "+result)); 
source.subscribe(result -> System.out.println("update result "+result)); 

위 분명히

save to database foo 
update result foo 

을 생산 나는 또한 시도

가있는 아래의 예상 결과를 제공하지만, 여전히 기분이 ... 이상 하네.

결과가 존재하거나 없을 때 어떻게 조치 할 수 있습니까? 그 유스 케이스는 rxjava2에서 어떻게 처리되어야 하는가? 01

업데이트 나는 아래를 시도하고 내가 위에서 해낸 것보다 청소기 보인다. 그러나 rxjava2 연습을 권장합니다.

Maybe.just(new String("foo")) 
    .map(value -> Optional.of(value)) 
    .defaultIfEmpty(Optional.empty()) 
    .subscribe(result -> { 
     if(result.isPresent()) { 
      System.out.println("update result "+result); 
     } 
     else { 
      System.out.println("save to database "+"bar"); 
     } 
    }); 

+0

원본 Observable에서 두 번 구독 중입니다. 당신이 그것을 두 번 실행할 것이라는 의미입니다. 두 코드 블록에서 모두 표시하고 있습니다. – masp

+0

@masp 당신이 맞습니다. 이것은 나의 일을하는 방식이 아닙니다. Empty (비어 있음) 및 Non-Empty (비 공백) 결과에 대해 조치를 취하고 싶을 때 내 문제를 어떻게 해결 하시겠습니까? – simon

+0

첫 번째 블록의 첫 번째 3 줄은 실제로 잘 보입니다. 그러나 그들은 소스가 뭔가를 방출하는 경우 만 다룹니다. 그래서, 소스가 아무것도 나오지 않는 다른 케이스를 생성하면 (간단히 완료), 두 번째 Observable이 실행되는 것을 볼 수 있습니다. 또한 개인적으로 doOn * 메소드를 로그에만 사용합니다. – masp

답변

0

다음과 같이 시도해보십시오. checkDB은 Maybe 또는 Single 또는 optional 또는 래퍼 객체를 내보내는 것을 반환 할 수 있습니다.

checkDB(String) 
      .flatMap(s -> { 
       if (s.isPresent()) { 
        return updateDB(s.get()); 
       } else { 
        return insertDB("new String"); 
       } 
      }) 
0

당신은 아마 소스가 비어 있거나없는 경우 부울 반환됩니다 IsEmpty 함수() 연산자를 가지고 있고, 당신은 그것을 flatMap하고 이것은 그 부울

0

에 따라 경우 다른 문을 작성할 수 있습니다 우리의 코드에서도 일반적인 패턴이지만, 우리의 경우에는 선택 사항 자체가 비동기입니다. flatMapX와 switchIfEmpty를 (어느 쪽의 순서로) 작성해도 올바른 의미를 얻을 수 없으므로 이것이 왜 API의 일부가 아닌지 궁금합니다. 우리는 그루비를 사용하고

public static <T> Completable flatMapCompletable(Maybe<T> target, 
               @ClosureParams(FirstParam.FirstGenericType.class) 
                 Closure<? extends CompletableSource> completableSupplier, 
               Supplier<CompletableSource> emptySupplier) { 
    Maybe<T> result = target.cache(); 
    return result.isEmpty().flatMapCompletable(empty -> { 
     if (empty) { 
      return emptySupplier.get(); 
     } else { 
      return result.flatMapCompletable(completableSupplier::call); 
     } 
    }); 
} 

그래서, 다음은

합니다 (이 옵션은 모두 Completables 때, 우리는 유사한 다른 유형의 것들뿐만 아니라이이 예를 들어) 우리가 지금하고있는 일입니다 우리는 이들을 확장 메소드로 패키지화합니다. 나는 cache()을 사용할 필요가 있다는 것에 감격하지 않으므로 더 나은 대안이 있는지 궁금합니다. 코드를 보면서, 기본적으로 flatMapX와 스위치를 결합한 연산자는 너무 어려울 것 같지 않습니다 (하지만 뭔가를 놓친 것 같은 느낌입니다).