在前面的一个问题[How to dynamic do filtering In Java8?]中,Stuart Marks给出了一个很好的答案,并提供了几个有用的实用程序来处理从Stream中选择topN和topperty。
我将把他最初的回答包括在这里:
@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}
用户skiwi已经回答了问题的第一部分。第二部分是:
(2)如何从一个有一定数量物品的流中获得前10%到前30%的顶级物品....
要做到这一点,您必须使用与我在回答另一个问题时使用的toppercent
类似的技术。也就是说,您必须将元素收集到一个列表中,以便能够获得元素的计数,可能是在完成了一些上游过滤之后。
获得计数后,根据计数和所需百分比计算skip
和limit
的正确值。类似这样的方法可能会奏效:
Criterion topPercentFromRange(Comparator<Widget> cmp, double from, double to) {
return stream -> {
List<Widget> temp =
stream.sorted(cmp).collect(toList());
return temp.stream()
.skip((long)(temp.size() * from))
.limit((long)(temp.size() * (to - from)));
};
}
当然,您必须对从
和到
进行错误检查。一个更微妙的问题是确定发射多少元素。例如,如果您有十个元素,它们位于索引[0..9],对应于0%、10%、20%、...、90%。但是如果您要求的范围是9%到11%,上面的代码将不会发出任何元素,而不是像您所期望的那样10%的元素。因此,可能有必要对百分比计算进行一些修修补补,以适应您所要做的事情的语义。
问题内容: 在上一个问题中如何在Java 8中动态进行过滤?StuartMarks给出了一个很好的答案,并提供了一些有用的实用程序来处理从流中选择topN和topPercent。 我将从他的原始答案中将它们包括在这里: 我的问题是: [1]如何从具有一定数量项目的流中获取3到7的顶级项目,因此,如果流中有A1,A2 .... A10中的项目,则调用 将返回{A3,A4,A5,A6,A7} 我能想到
给定一个元素列表,我想获取具有给定属性的元素并将其从列表中删除。我找到的最佳解决方案是: 是否可以在lambda表达式中组合get和删除?
问题内容: 我有一个看起来像这样的列表列表: 删除重复列表的最佳方法是什么?使用上面的示例,我正在寻找会产生这种情况的代码: 我最初以为我可以使用,但这似乎不适用于列表列表。我还看到了一个使用的示例,但是代码对我来说并不完全清楚。谢谢您的帮助! 问题答案: uniq_animal_groups = set(map(tuple, animal_groups)) 尽管您将得到一组元组而不是一组列表,但
我要根据列表中项目的属性(邮件)从列表中删除重复项。 我执行了以下操作:
我试图从与该卡类型相关联的列表箱中获得一系列卡类型,但每当我运行代码时,卡类型被打印为空,我不确定我做错了什么 这是文本中的垃圾箱 每当我通过4111111111而不是获得签证时,我都会得到零分, 这就是我到目前为止所做的 我做错了什么,抓耳挠腮了几个小时
我正在尝试使用Rest Asure获取的第一个值,用于。 当我使用 我得到: 学生ID 123有10多个课程列表。也可以使用正则表达式从JSON响应中获取特定元素,或者当我有几千行JSON响应时,如何获取元素的路径。 样本响应-
我想从excel表格中读取一组用户名和密码。我的用户名出现在第一列,但我的密码值出现在第8列。我不想通过给出第8列地址来读取第8列的值。相反,我想在excel工作表中的任何地方读取密码值。有什么办法可以做到这一点吗? FileInputStream fs=new FileInputStream(strReadFile); 工作簿wb=Workbook.getWorkbook fs; 工作簿sh=w
Project的构建没有任何错误,但是当我进入exploper并查找文件夹时,它没有生成。我尝试清理和构建,无效缓存和重新启动,但它不起作用。如何获取r.java文件? 这是构建日志 我在下面提到了这样的线程,并尝试了一切,但没有任何工作。 这个有什么已知的bug吗?