flatMap con if else vs si combinano con il filtro

3

Quando si usano framework reattivi ho visto entrambe le soluzioni di seguito per effettuare una selezione mutuamente esclusiva di quale flusso verrà inoltrato (rxjava in questo caso)

Observable.merge(
  Observable.just(aBoolStatement).filter(aBoolean -> aBoolean).flatMap(aBoolean -> signal1),
  Observable.just(aBoolStatement).filter(aBoolean -> !aBoolean).flatMap(aBoolean -> signal2)      
)

-

Observable.just(aBoolStatement).flatMap(aBoolean -> {
  if(aBoolean)
    return signal1
  else
    return signal2
}

Il primo codice è tutto rx che è bello, ma valuta anche la dichiarazione due volte che è facile perdere se è necessario aggiornare la dichiarazione. C'è un modo preferito di fare questo o qualsiasi altro modo per ottenere lo stesso risultato?

    
posta Erik Johansson 03.12.2015 - 14:33
fonte

1 risposta

5

Questo probabilmente dipende in gran parte dalle dimensioni dell'input, ma il primo esempio sta sicuramente facendo un lavoro più inutile. Deve filtrare l'input due volte e quindi unirlo di nuovo. Il secondo esempio ottiene tutto in un solo passaggio.

Inoltre, il secondo può essere scritto come un one-liner abbastanza elegante (supponendo che questo sia Scala, che sembra essere)

Observable.just(aBoolStatement).flatMap(b -> if(b) signal1 else signal2)

Ciò è dovuto al fatto che if è un'espressione che restituisce un valore in Scala, quindi includere la parola chiave return su ciascun ramo è ridondante. Usare if come questo equivale a usare un'espressione ternaria ( b ? signal1 : signal2 ) in un'altra lingua che supporta quella sintassi.

    
risposta data 03.12.2015 - 15:09
fonte

Leggi altre domande sui tag