W poprzednim pytaniu [How to dynamically do filtering in Java 8?] Stuart Marks podał wspaniałą odpowiedź i dostarczył kilka przydatnych narzędzi do obsługi wyboru topN i topPercent ze strumienia.Jak uzyskać szereg produktów ze strumienia za pomocą Java 8 lambda?
będę włączyć je tutaj ze swojego oryginalnego odpowiedź:
@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));
};
}
Moje pytania są tutaj:
[1] Jak uzyskać najwyższe pozycje od 3 do 7 ze strumienia z pewnej wysokości przedmiotów, tak, że strumień ma elementy z A1, A2 .. A10 wywołaniu
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
powróci {A3, A4, A5, A6, A7}
Najprostszym sposobem, jaki mogę wymyślić, jest uzyskanie pierwszej 7 [T7] z oryginału, zdobycie pierwszej 3 [T3] z oryginału, a następnie uzyskanie T7 - T3.
[2] Jak uzyskać najlepsze elementy z górnej 10% do 30% od góry strumienia z pewnej ilości elementów, więc jeżeli strumień posiada elementy z X1, X2 .. X100, wezwanie do
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, 0.30)
powróci {X10, X11, X12, X29, ..., X30}
Najprostszym sposobem mogę myśleć, to dostać górny 30% [TP30] od oryginału, dostać Top 10% [TP10 ] z oryginału, a następnie pobierz TP30 - TP10.
Jakie są lepsze sposoby wykorzystania Javy 8 Lambdy do zwięzłego wyrażenia powyższych sytuacji?
Wystarczająco blisko tego, czego szukałem, opracuję szczegóły, dzięki! – Frank
Uaktualniłem moją odpowiedź, aby zawierało również formę tego, co robisz, ale potem używając Kolekcjonerów, być może mogłoby to być interesujące również dla pierwotnego pytania o kryteria? – skiwi
@skiwi Ciekawe, używając funkcji finiszera kolektora, aby z powrotem przywrócić kolekcję do strumienia. Nie jestem pewien, czy jest to lepsze, czy gorsze od deklarowania zmiennej lokalnej. (W tym przypadku parametr lambda jest używany jako lokalny). Jest to jednak przydatna technika, o której należy pamiętać w przyszłości. –