Random random = new Random();
random.ints()
.filter(e -> e<40 && e>1)
.limit(10)
.sorted()
.distinct()
.forEach(System.out::println);
我需要不同的数据,但也需要更快。通过删除这个独特的执行更快一点
答案 0 :(得分:4)
您的代码生成的随机整数范围为Integer.MIN_VALUE
到Integer.MAX_VALUE
。这些值中只有一小部分符合您的要求。因此,生成大量随机数,您将丢弃&gt; 99%....这需要花费很多时间。
Random
有一个3-arguments version ints()
,可以替换一半代码。参数是streamize,以及数字的上限和下限。
您的代码如下所示:
Random random = new Random();
random.ints(10,2,40)
.sorted()
.distinct()
.forEach(System.out::println);
请注意,您不能保证获得10个号码,因为在设置了streamize之后会使用distinct
。
答案 1 :(得分:4)
正如this answer中已经提到的,您应该使用三arg工厂方法而不是filter
和limit
。这样可以避免生成随后会丢失的随机值。对于某些流操作,提前知道结果流大小(非直观地不适用于limit
)也是有益的。
此外,如果您知道要按顺序处理元素,则应使用ThreadLocalRandom
(否则,如果您要处理并行流,则使用new SplittableRandom()
。)
ThreadLocalRandom.current().ints(10,2,40)
.sorted()
.distinct()
.forEach(System.out::println);
如果仍然贵,请使用
ThreadLocalRandom.current().ints(10,2,40)
.collect(BitSet::new, BitSet::set, BitSet::or)
.stream()
.forEach(System.out::println);
作为BitSet
本质上是分类和不同的。这比当前的IntStream
实现更有效,它将收集到int[]
数组中以对值进行排序,并使用HashSet<Integer>
来确定它是否已经看到了值。