In einer vorherigen Frage [How to dynamically do filtering in Java 8?] gab Stuart Marks eine wundervolle Antwort und stellte mehrere nützliche Dienstprogramme zur Verfügung, um die Auswahl von topN und topPercent aus dem Stream zu behandeln.Wie erhalten Sie eine Reihe von Elementen aus Stream mit Java 8 Lambda?
Ich werde sie hier von seiner ursprünglichen Antwort enthalten:
@FunctionalInterface
public interface Criterion {
Stream<Widget> apply(Stream<Widget> s);
}
Criterion topN(Comparator<Widget> cmp, long n) {
return stream -> stream.sorted(cmp).limit(n);
}
Criterion topPercent(Comparator<Widget> cmp, double pct) {
return stream -> {
List<Widget> temp =
stream.sorted(cmp).collect(toList());
return temp.stream()
.limit((long)(temp.size() * pct));
};
}
Meine Frage lautet hier:
[1] Wie oben Artikel 3 bis 7 aus einem Strom mit bestimmtem Betrag erhalten von Artikel, so dass, wenn der Strom hat Elemente von A1, A2 .. A10, der Aufruf von
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
kehrt {A3, A4, A5, A6, A7}
Die einfachste Art, an die ich denken kann, ist, die Top 7 [T7] vom Original zu bekommen, die Top 3 [T3] vom Original zu bekommen und dann T7 - T3 zu bekommen.
[2] Wie oben Artikel von oben 10% bis 30% erhält aus einem Strom mit bestimmten Menge von Gegenständen nach oben, so dass, wenn der Strom hat Elemente aus X1, X2 .. X100, der Aufruf an
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, 0.30)
kehren {X10, X11, X12, ..., X29, X30}
der einfachste Weg, die ich denken kann, ist das Top-30% [TP30] aus original erhalten, das besten 10% erhalten [TP10 ] vom Original und dann TP30 - TP10.
Was sind einige bessere Möglichkeiten, Java 8 Lambda zu verwenden, um die obigen Situationen präzise auszudrücken?
Nah genug zu dem, was ich suchte, werde ich die Details erarbeiten, danke! – Frank
Ich habe meine Antwort aktualisiert, um auch eine Form von dem, was Sie tun, aber dann mit Collectors, vielleicht könnte es auch für die ursprüngliche Frage der Kriterien interessant sein? – skiwi
@skiwi Interessant, die Finisher-Funktion eines Collectors zu verwenden, um die Sammlung wieder in einen Stream zu verwandeln. Ich bin mir nicht sicher, ob es unbedingt besser oder schlechter ist, als nur eine lokale Variable zu deklarieren. (Der Lambda-Parameter wird in diesem Fall wie ein Local verwendet.) Es ist jedoch eine nützliche Technik, die man sich für die Zukunft merken sollte. –