java - RxJava 中的过滤器

标签 java android rx-java rx-android

 class Transaction
 {
        int transactionId,transactionType,transactionStatus;
        double transactionAmount;
        Date transactionDate;    
}

我想使用 RxJava 根据组合 Transaction 属性过滤交易列表。组合会改变运行时,因此有人可以帮助我如何使用 filter() 运算符进行相同的操作

最佳答案

不久前我不得不做你想做的同样的事情。我创建了一个简单的解决方案来处理多重过滤,如下所示:

public class ExampleUnitTest {
    @Test
    public void testSample() throws Exception {
        TransactionDatabase transactionDatabase = new TransactionDatabase();

        transactionDatabase.insert(new Transaction(1, 50.00, new Date()));
        transactionDatabase.insert(new Transaction(2, 20.00, new Date()));
        transactionDatabase.insert(new Transaction(3, 110.00, new Date()));
        transactionDatabase.insert(new Transaction(4, 250.00, new Date()));
        transactionDatabase.insert(new Transaction(5, 5.00, new Date()));
        transactionDatabase.insert(new Transaction(5, 73.00, new Date()));

        List<Func1<Transaction, Boolean>> filters = new ArrayList<>();

        filters.add(transaction -> transaction.transactionAmount > 20);
        filters.add(transaction -> transaction.transactionAmount < 100);

        transactionDatabase.getTransactions(filters)
                .subscribe(System.out::println);
    }

    private class Transaction {
        int transactionId;
        double transactionAmount;
        Date transactionDate;

        public Transaction(int transactionId, double transactionAmount, Date transactionDate) {
            this.transactionId = transactionId;
            this.transactionAmount = transactionAmount;
            this.transactionDate = transactionDate;
        }

        @Override
        public String toString() {
            return "Transaction{" +
                    "transactionId=" + transactionId +
                    ", transactionAmount=" + transactionAmount +
                    ", transactionDate=" + transactionDate +
                    '}';
        }
    }

    class TransactionDatabase {
        List<Transaction> transactions = new ArrayList<>();

        public void insert(Transaction transaction) {
            transactions.add(transaction);
        }

        public Observable<Transaction> getTransactions(List<Func1<Transaction, Boolean>> filters) {
            Observable<Transaction> observable = Observable.from(transactions);

            for (Func1<Transaction, Boolean> filter : filters) {
                observable = observable.filter(filter);
            }

            return observable;
        }
    }
}

它将打印:

Transaction{transactionId=1, transactionAmount=50.0, transactionDate=Tue Jun 14 16:21:24 BRT 2016}
Transaction{transactionId=5, transactionAmount=73.0, transactionDate=Tue Jun 14 16:21:24 BRT 2016}

我认为这对于您的问题来说是一个很好的解决方案。

希望对您有所帮助。

最诚挚的问候。

关于java - RxJava 中的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37815170/

相关文章:

java - 修复 Java 中的硬编码 Windows 路径,使其在 Linux 中也能正常工作

java - Eclipse (ADT) 中的内存错误 - 错误的 Java 版本?

java - Java VM EXCEPTION_ACCESS_VIOLATION 的可能原因?

Android 手机无法通过 USB 在 Ubuntu/Windows 上识别

由于收集复杂,Android 应用程序崩溃。无法评估表达式 - 无法生成表达式 KTObject 文字异常

java - 无法从 Cmd 类型对非静态方法 getVideoURL() 进行静态引用

android - 如果没有 @Provides 或 @Produces 注释的方法,则无法提供 rx.Scheduler

rx-java - 仅在链中的 Observable 发出事件后才获取事件

android - RxJava如何过滤子树然后返回树

JAVA,Switch case需要两个条目才能工作