如何使用Java 8 lambda从流中获取一系列项目?
在前面的问题中 [ 如何在 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简洁地表达上述情况有哪些更好的方法?