В предыдущем вопросе [Как динамически выполнять фильтрацию в Java 8?] Стюарт Маркс дал прекрасный ответ и предоставил несколько полезных утилит для обработки выбора topN и topPercent from stream.
Я включу их здесь из своего первоначального ответа:
@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));
};
}
Мои вопросы здесь:
[1] Как получить верхние элементы от 3 до 7 из потока с определенным количеством элементов, поэтому, если в потоке есть элементы из A1, A2.. A10, вызов
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
вернет {A3, A4, A5, A6, A7}
Самый простой способ, по которому я могу думать, - получить верхнюю 7 [T7] от оригинала, получить верхнюю 3 [T3] от оригинала, а затем получить T7 - T3.
[2] Как получить верхние позиции от 10% до 30% от потока с определенным количеством элементов, поэтому, если в потоке есть элементы из X1, X2.. X100, вызов
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, 0.30)
вернет {X10, X11, X12,..., X29, X30}
Самый простой способ, который я могу придумать, - получить 30% лучших [TP30] от оригинала, получить топ 10% [TP10] от оригинала, а затем получить TP30 - TP10.
Каковы некоторые лучшие способы использования Java 8 Lambda для краткого выражения вышеуказанных ситуаций?