在上一个问题中如何在Java 8中动态进行过滤?StuartMarks给出了一个很好的答案,并提供了一些有用的实用程序来处理从流中选择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来简洁地表达上述情况?
用户skiwi已经回答了问题的第一部分。第二部分是:
(2)如何从具有一定项目量的流中将前10%到前30%的顶级项目获取....
为此,您必须使用与topPercent
我对其他问题的回答中类似的技术。也就是说,您必须将元素收集到一个列表中,以便可能在完成一些上游筛选之后获得html" target="_blank">元素的计数。
有了计数后,便可以根据计数和所需的百分比为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)));
};
}
当然,您将必须对from
和进行错误检查to
。一个更微妙的问题是确定要发射多少个元素。例如,如果您有十个元素,则它们的索引为[0..9],分别对应于0%,10%,20%,…,90%。但是,如果您要求的范围是9%到11%,则上面的代码将根本不发出任何元素,而不像您期望的那样发出10%的元素。因此,可能有必要对百分比计算进行一些修改,以适应您要尝试执行的语义。
给定一个元素列表,我想获取具有给定属性的元素并将其从列表中删除。我找到的最佳解决方案是: 是否可以在lambda表达式中组合get和删除?
问题内容: 我想从Java 8中检索和删除下一个项目,而不会关闭它。 这可能吗? 问题答案: 基于Stuart的回答,并进行了从Iterator到Stream的转换,我想到了以下快速而又简单的包装器类。它没有经过测试,也不是线程安全的,但是它为我提供了我目前需要的—移除并使用单个项目,同时保持 此 流“开放”。 提供一种方法,该屏蔽远的 终端流操作 的语义: 一个小测试:
问题内容: 我有一个看起来像这样的列表列表: 删除重复列表的最佳方法是什么?使用上面的示例,我正在寻找会产生这种情况的代码: 我最初以为我可以使用,但这似乎不适用于列表列表。我还看到了一个使用的示例,但是代码对我来说并不完全清楚。谢谢您的帮助! 问题答案: uniq_animal_groups = set(map(tuple, animal_groups)) 尽管您将得到一组元组而不是一组列表,但
问题内容: 当我发现有些奇怪的东西时,我正在学习如何使用Java 8流。 除了浮点数组外,其他所有方法都有: 类似地,也有用于int,double等的Stream实现,但没有float: 有什么理由吗? 推荐使用浮动流的方法是什么? 问题答案: 来自Cay S.Horstmann: 2.12。基本类型流 …如果要存储short,char,byte和boolean,请使用IntStream,对于fl
我在学习如何使用java 8流时,发现了一些奇怪的事情。 <代码>数组。stream()具有除浮点数组之外的所有方法: <代码>数组。流(int[]):int流 同样,有int、双精度等的Stream实现,但没有浮点数: 有什么原因吗? 使用浮动流的推荐方法是什么?