代码需要花费很多时间才能执行?

时间:2017-04-19 08:39:00

标签: java-8

Random random = new Random();
random.ints()
      .filter(e -> e<40 && e>1) 
      .limit(10)
      .sorted()
      .distinct()  
      .forEach(System.out::println);

我需要不同的数据,但也需要更快。通过删除这个独特的执行更快一点

2 个答案:

答案 0 :(得分:4)

您的代码生成的随机整数范围为Integer.MIN_VALUEInteger.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工厂方法而不是filterlimit。这样可以避免生成随后会丢失的随机值。对于某些流操作,提前知道结果流大小(非直观地不适用于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>来确定它是否已经看到了值。