在上一个问题中[如何在Java 8中动态进行过滤?] 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]如何从具有一定数量的商品的流中获取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简洁地表达上述情况?