Java 8 代码执行花费了这么多时间?

Java 8 代码执行花费了这么多时间?,java-8,Java 8,我需要清晰的数据,但速度也更快。通过删除此不同的执行,您的代码将生成从Integer.MIN\u值到Integer.MAX\u值范围内的随机整数。这些值中只有一小部分符合您的要求。因此产生了大量的随机数,其中你丢弃了>99%。。。。这要花很多时间 Random有许多整数,可以替换一半的代码。参数是streamsize以及数字的上限和下限 您的代码如下所示: Random random = new Random(); random.ints() .filter(e -> e<

我需要清晰的数据,但速度也更快。通过删除此不同的执行,您的代码将生成从Integer.MIN\u值到Integer.MAX\u值范围内的随机整数。这些值中只有一小部分符合您的要求。因此产生了大量的随机数,其中你丢弃了>99%。。。。这要花很多时间

Random有许多整数,可以替换一半的代码。参数是streamsize以及数字的上限和下限

您的代码如下所示:

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

请注意,您不能保证获得10个数字,因为设置streamsize后会使用distinct。

您的代码会生成从Integer.MIN\u值到Integer.MAX\u值范围内的随机整数。这些值中只有一小部分符合您的要求。因此产生了大量的随机数,其中你丢弃了>99%。。。。这要花很多时间

Random有许多整数,可以替换一半的代码。参数是streamsize以及数字的上限和下限

您的代码如下所示:

Random random = new Random();
random.ints()
      .filter(e -> e<40 && e>1) 
      .limit(10)
      .sorted()
      .distinct()  
      .forEach(System.out::println);
请注意,您不能保证获得10个数字,因为在设置streamsize后会使用distinct。

如中所述,您应该使用三参数工厂方法,而不是筛选和限制。这样可以避免生成随机值,这些值将在以后删除。对于某些流操作,提前知道结果流的大小是非常有益的,这在非直觉上不适用于限制

此外,如果您知道要按顺序处理元素,则应使用ThreadLocalRandom;否则,如果要处理并行流,则应使用new SplittableRandom

Random random = new Random();
random.ints(10,2,40)
      .sorted()
      .distinct()  
      .forEach(System.out::println);
如果仍然很贵,请使用

ThreadLocalRandom.current().ints(10,2,40)
    .sorted()
    .distinct()  
    .forEach(System.out::println);
因为位集本质上是排序的和不同的。这比当前的IntStream实现要高效得多,它将收集到一个int[]数组中对值进行排序,并使用哈希集确定是否已看到值。

如中所述,您应该使用三参数工厂方法,而不是筛选和限制。这样可以避免生成随机值,这些值将在以后删除。对于某些流操作,提前知道结果流的大小是非常有益的,这在非直觉上不适用于限制

此外,如果您知道要按顺序处理元素,则应使用ThreadLocalRandom;否则,如果要处理并行流,则应使用new SplittableRandom

Random random = new Random();
random.ints(10,2,40)
      .sorted()
      .distinct()  
      .forEach(System.out::println);
如果仍然很贵,请使用

ThreadLocalRandom.current().ints(10,2,40)
    .sorted()
    .distinct()  
    .forEach(System.out::println);

因为位集本质上是排序的和不同的。这比当前的IntStream实现要高效得多,它将收集到一个int[]数组中对值进行排序,并使用哈希集确定它是否已经看到值。

而不是生成随机整数,然后在您关心的范围内查找它们的极小部分,在您首先关心的范围内生成它们。描述如何执行此操作。与其生成随机整数,然后在您关心的范围内查找它们的极小部分,不如首先在您关心的范围内生成它们。描述如何执行此操作。是的,您的代码速度很快,但我的代码花费大量时间执行的原因是什么?您的代码生成的随机整数范围为Integer.MIN\u值到Integer.MAX\u值。这些值中只有一小部分符合您的要求。因此,生成了大量随机数,其中您丢弃了>99%…是的,您的代码速度很快,但我的代码花费大量时间执行的原因是什么?您的代码生成的随机整数范围从Integer.MIN_值到Integer.MAX_值。这些值中只有一小部分符合您的要求。因此,会生成大量的随机数,您丢弃这些随机数>99%……旁注:只有当数字为正数时,位集才适用。@Flown:并且值范围和元素数之间应该有一个合理的比率才能有效,即,如果值非常稀疏,则流的HashMap方法会更好。如果值范围(即最小值)离零太远,则最好保持偏移量,而不是存储[0…最大值]范围。我想,这就是为什么通用IntStream实现不使用这种技巧的原因,支持任意用例要困难得多。旁注:只有当数字为正数时,位集才适用。@Flown:并且值范围和元素数之间应该有一个合理的比率才能有效,即,如果值非常稀疏,则流的HashMap方法会更好。如果值范围(即最小值)离零太远,则最好保持偏移量,而不是存储[0…最大值]范围。我想,这些是 通用IntStream实现不使用这种技巧的原因是,支持任意用例要困难得多。