Ich habe eine Liste von Transaktionen. Jede Transaktion enthält unter anderem Informationen zu Währung und Betrag. Ich möchte eine Liste der Bestände erstellen, also den aktuellen Betrag nach Währung. Ich habe mit groupBy() angefangen und mit reduce fortgesetzt. Es scheint, ich habe zu abonnieren, bevor ich etwas mit den Ergebnissen tun, denn dies ist mir einen Fehler gibt:Wie eine Liste nach groupBy in RxJava 2 bekommen?
Observable.fromIterable(transactions)
.groupBy(Transaction::getCurrency)
.flatMap(t -> t.reduce(new Holding(t.getKey()), (holding, transaction) -> holding.addTransaction(transaction.getAmount()))
Er sagt: „keine Instanz des Typs Variable R vorhanden sein, damit Einzel < erstreckt R ObservableSource entspricht> ". wenn
Auf der anderen Seite versuche ich dies:
Observable.fromIterable(transactions)
.groupBy(Transaction::getCurrency)
.subscribe((GroupedObservable<String, Transaction> r) -> r.reduce(new Holding(r.getKey()), (holding, transaction) -> holding.addTransaction(transaction.getAmount()))
.toObservable()
.subscribe(t -> {
//t is a single Holding.
}
));
Ich kann nicht eine Liste bekommen, weil ich schon zu dem gruppierten Strom abonnierte. Ich könnte es hinzufügen, aber ich bin mir ziemlich sicher, dass es eine elegantere Lösung gibt, aber ich kann es nicht herausfinden.
Lösung basierend auf akarnokd Antwort:
Observable.fromIterable(transactions)
.groupBy(Transaction::getCurrency)
.flatMapSingle(Observable::toList)
.map(Holding::new)
.toList()
.subscribe(holdings -> {
whatever(holdings);
});
Try 'flatMapSingle' sicher arbeiten Dies wird. Außerdem ist das Abonnieren von einem onNext-Handler eine schlechte Übung, da Sie die Kompositionseigenschaften von RxJava verlieren. – akarnokd
@akarnokd Das tat es. Ich brauche nicht einmal reduzieren. Würdest du eine Antwort posten oder sollte ich? – Herrbert74