在之前的问题[ 如何在 Java8中动态地进行过滤?]中,Stuart Marks 给出了一个很好的答案,并提供了几个有用的实用程序来处理从流中选择 topN 和 topPercent 的问题。
我会在这里列出他最初的回答:
@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] How to get top items from 3 to 7 from a stream with certain amount of items, so if the stream has items from A1, A2 .. A10, the call to
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
将返回{ A3,A4,A5,A6,A7}
我能想到的最简单的方法是从原始文件中获取 top 7[ T7] ,从原始文件中获取 top 3[ T3] ,然后获取 T7-T3。
[2] How to get top items from top 10% to top 30% from a stream with certain amount of items, so if the stream has items from X1, X2 .. X100, the call to
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。
有什么更好的方法可以使用 Java8Lambda 简洁地表达上述情况?