我可以检查Java 8流是否包含至少n个元素吗?
我有一个Java 8流,我想从中(统一)随机选择一个元素。该流可以包含从零到数万个元素的任何地方。
我已经实现了一种算法,该算法使用类似MapReduce的模式选择一个,但是对于非常小的流,将项目收集到List中并返回具有随机索引的项目可能会更有效。然而,为此,我必须数一数。流确实有一个count()方法,但它将它们全部计算在内,我对实际计数并不感兴趣,我所关心的只是它是否包含多个待定数字。有谁知道是否存在这种方法?我找不到它,但可能有一些我忽略了的东西,或者一些聪明的技巧来找到它。
P.S.:我知道有时没有必要优化代码。但我想尝试一下,只是为了体验。我是学生。
P.P.S.:我已经在这里复制了我的算法,以防有人感兴趣(或者想寻找错误,我还没有测试过;-)
stream
.parallel()
.map(t -> new Pair<T, Integer>(t, 1))
.reduce((Pair<T, Integer> t, Pair<T, Integer> u) -> {
if (rand.nextDouble() <= (t.getValue1() / (double) (t.getValue1() + u.getValue1()))) {
return new Pair<>(t.getValue0(), t.getValue1() + u.getValue1());
} else {
return new Pair<>(u.getValue0(), t.getValue1() + u.getValue1());
}
})
.map(t -> t.getValue0());
(这些对来自 org.javatuples,现在 Java 支持类似函数式编程的接口,缺少元组确实变得有点痛苦)。