2016-03-17 6 views
7

तोड़ने के बिना ऑपरेटर को सब्जियों को सशर्त रूप से लागू करने के लिए कैसे करें। मेरे पास आरएक्सजेवा देखने योग्य पर ऑपरेटरों की एक श्रृंखला है। मैं "श्रृंखला को तोड़ने" के बिना बुलियन मूल्य के आधार पर दो ऑपरेटरों में से एक को लागू करने में सक्षम होना चाहता हूं।आरएक्सजेवा: शृंखला

मैं आरएक्स (जावा) के लिए अपेक्षाकृत नया हूं और मुझे लगता है कि एक अस्थायी चर शुरू करने के मेरे वर्तमान दृष्टिकोण से ऐसा करने का शायद एक और बेवकूफ और पठनीय तरीका है।

यहाँ एक ठोस उदाहरण है, एक नमूदार से आइटम बफरिंग एक बैच का आकार क्षेत्र में गैर-शून्य है अगर, अन्यथा toList() साथ असीम आकार का केवल एक बैच उत्सर्जन:

Observable<Item> source = Observable.from(newItems); 
Observable<List<Item>> batchedSource = batchSize == null ? 
       source.toList() : 
       source.buffer(batchSize); 
return batchedSource.flatMap(...).map(...) 

यह संभव तरह कुछ है? (छद्म lambdas क्योंकि जावा):

Observable.from(newItems) 
    .applyIf(batchSize == null, 
      { o.toList() }, 
      { o.buffer(batchSize) }) 
    .flatMap(...).map(...) 

उत्तर

8

आप compose(Func1) प्रयोग-अनुक्रम रहने के लिए कर सकते हैं लेकिन ऐसा कस्टम व्यवहार

source 
.compose(o -> condition ? o.map(v -> v + 1) : o.map(v -> v * v)) 
.filter(...) 
.subscribe(...) 
+2

बिल्कुल सही! बहुत बहुत धन्यवाद। 'compose() 'वर्तमान में आधिकारिक ऑपरेटर दस्तावेज़ों में दिखाई नहीं दे रहा है लेकिन एक त्वरित खोज ने एक अच्छा ब्लॉग पोस्ट सामने आया जिसे शाब्दिक रूप से" चेन न करें "कहा जाता है: http://blog.danlew.net/2015/03/ 02/डॉन-ब्रेक-द-चेन/ – user1405990

+0

क्या होगा यदि स्थिति आइटम के अंदर ही है? उदाहरण: wallpapers.map {it.bitmap! = null {डाउनलोड करें और सेट करें} {बस सेट करें}} – feresr

+1

'flatMap' या 'concatMap' का उपयोग करें। – akarnokd

संबंधित मुद्दे