Ich versuche zu verstehen, ob es eine Möglichkeit gibt, die Reduktionsoperation zu beenden, ohne den gesamten Strom zu untersuchen, und ich kann keinen Weg finden.Java 8: Unterbrechen der Reduktionsoperation von der Untersuchung aller Stream-Elemente
Der Anwendungsfall ist ungefähr wie folgt: Lassen Sie eine lange Liste von Integer
s, die in eine Accumulator
gefaltet werden muss. Jede Elementprüfung ist potentiell teuer, also führe ich innerhalb der Accumulator
eine Überprüfung der eingehenden Accumulator
durch, um zu sehen, ob wir sogar teure Operationen durchführen müssen - wenn nicht, dann gebe ich einfach den Akkumulator zurück.
Dies ist offensichtlich eine gute Lösung für kleine (er) Listen, aber riesige Listen verursachen unnötige Kosten für den Besuch von Stromelementen, die ich vermeiden möchte.
Hier ist eine Codeskizze - nehmen Sie nur serielle Reduktionen an.
class Accumulator {
private final Set<A> setA = new HashSet<>;
private final Set<B> setB = new HashSet<>;
}
class ResultSupplier implements Supplier<Result> {
private final List<Integer> ids;
@Override
public Result get() {
Accumulator acc = ids.stream().reduce(new Accumulator(), f(), (x, y) -> null);
return (acc.setA.size > 1) ? Result.invalid() : Result.valid(acc.setB);
}
private static BiFunction<Accumulator, Integer, Accumulator> f() {
return (acc, element) -> {
if (acc.setA.size() <= 1) {
// perform expensive ops and accumulate results
}
return acc;
};
}
}
Neben mit der ganzen Stream
, gibt es eine andere Tatsache Ich mag nicht zu durchqueren - ich zweimal den gleichen Zustand überprüfen (nämlich setA
Größe Prüfung).
Ich habe map()
und collect()
Operationen in Betracht gezogen, aber sie schienen nur mehr von der gleichen und nicht finden, sie ändern wesentlich die Tatsache, dass ich nur die Falte-Operation beenden kann, ohne den gesamten Stream zu untersuchen.
Darüber hinaus ist mein Denken, dass imaginäre takeWhile(p : (A) => boolean)
Stream API-Korrespondent uns auch nichts kaufen würde, da die Abschlussbedingung auf den Akku, nicht Stream-Elemente per se abhängt.
Denken Sie daran, ich bin ein relativer Neuling in FP so - gibt es eine Möglichkeit, dies zu tun, wie ich es erwarte? Habe ich das ganze Problem falsch aufgesetzt oder ist das eine Einschränkung?
Ihre gesamte Verwendung von 'reduce' ist falsch, da Sie einen veränderbaren Container verwenden. Sie sollten 'collect' dafür verwenden. – Holger
Wie gesagt, ich habe das auch versucht - ich habe meinen'Akkumulator' einen 'IntConsumer' und später einen vollwertigen' Collector' gemacht, aber ich konnte keinen Weg sehen, die Vollstromuntersuchung zu unterbrechen. Kannst du weiter darauf hinweisen, was zu tun ist? – quantum
Verwandte (vielleicht sogar duplizieren, aber nicht streng): http://stackoverflow.com/questions/20746429/java-8-limit-infinite-stream-by-a-predicate – Marco13