【问题标题】:Filter in RxJavaRxJava 中的过滤器
【发布时间】:2016-06-14 14:41:01
【问题描述】:
 class Transaction
 {
        int transactionId,transactionType,transactionStatus;
        double transactionAmount;
        Date transactionDate;    
}

我想使用 RxJava 根据组合 Transaction 属性过滤交易列表。组合改变了运行时间,所以有人可以帮助我如何使用 filter() 操作符

【问题讨论】:

  • 不清楚您究竟想如何过滤这些项目,或者您尝试了什么(以及为什么没有奏效)。请更详细地解释(也许用一个例子)你期望发生什么以及你已经尝试过什么。
  • @tanis 我尝试使用过滤器运算符,但我能够使用一个属性过滤该列表,但在我的情况下,用户可以选择多个过滤器,如交易金额范围和交易等等,我正在使用 RxJava第一次
  • 您可以多次调用filter() 应用多个过滤器,或者您可以制作一个更复杂的过滤器,以更自定义的方式应用多个过滤器。
  • 但是如果我没记错的话,我怎么能用两个属性的组合来调用过滤器,比如金额和日期
  • 好的,谢谢,我会将第一个过滤器的结果传递给第二个过滤器并得到结果

标签: java android rx-java rx-android


【解决方案1】:

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

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}

我认为这是一个很好的解决您的问题的方法。

希望对你有帮助。

最好的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多