我有一个Java 8流,我想(统一)随机选择一个元素.流可以包含从零到数万个元素的任何位置.
我已经实现了一个使用MapReduce类模式选择一个算法的算法,但是对于非常小的流,将项目收集到List中并返回一个随机索引可能更有效.但是,我必须计算它们.Streams确实有一个count()方法但是它们全部计算,我对实际计数并不感兴趣,我关心的是它是否包含多个待定数字.有谁知道这种方法是否存在?我找不到它,但可能有一些我忽略的东西或者一些聪明的伎俩,无论如何都要找到它.
PS:我知道有时候没有必要优化代码; 但我想尝试一下,只是为了体验.我是学生.
PPS:我在这里复制了我的算法,万一有人感兴趣(或者想找bug,我还没有测试过;-)
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());
Run Code Online (Sandbox Code Playgroud)
(这些对来自org.javatuples,现在Java支持类似函数编程的接口,缺少元组确实会变得有点痛苦).