几种编程语言(例如Ruby或Python等)提供yield命令。 在内存消耗方面,Yield提供了一种有效的方式,可以通过按需生成值来创建一系列值。 有关Python产量的更多信息。
让我们考虑一个需要大量安全随机整数的类或方法。 经典方法是创建此类整数的数组或集合。 与这种方法相比,良率提供了两个主要优点:
- 产量不需要事先知道序列的长度。
- yield不需要将所有值存储在内存中。
幸运的是,得益于Stream API ,yield功能可以在Java 8中使用:
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Date;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class Yield {
private static final Integer RANDOM_INTS = 10;
public static void main(String[] args) {
try (Stream randomInt = generateRandomIntStream()){
Object[] randomInts = randomInt.limit(RANDOM_INTS)
.sorted().toArray();
for (int i = 0; i < randomInts.length;i++)
System.out.println(randomInts[i]);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static Stream generateRandomIntStream()
throws NoSuchAlgorithmException{
return Stream.generate(new Supplier() {
final SecureRandom random = SecureRandom
.getInstance("SHA1PRNG");
boolean init = false;
int numGenerated = 0;
@Override
public Integer get() {
if (!init){
random.setSeed(new Date().getTime());
init = true;
System.out.println("Seeding");
}
final int nextInt = random.nextInt();
System.out.println("Generated random "
+ numGenerated++
+ ": " + nextInt);
return nextInt;
}
});
}
}
以下是执行提供的代码段后的输出:
Seeding
Generated random 0: -896358073
Generated random 1: -1268521873
Generated random 2: 9627917
Generated random 3: -2106415441
Generated random 4: 935583477
Generated random 5: -1132421439
Generated random 6: -1324474601
Generated random 7: -1768257192
Generated random 8: -566921081
Generated random 9: 425501046
-2106415441
-1768257192
-1324474601
-1268521873
-1132421439
-896358073
-566921081
9627917
425501046
935583477
很容易看出, 供应商仅被实例化。 当然,我们可以利用所有Stream API功能,例如limit()和sorted()。
行randomInt.limit(RANDOM_INTS).sorted()。toArray()触发RANDOM_INTS值的生成,然后将其排序并存储为数组。
翻译自: https://www.javacodegeeks.com/2014/08/java-yield-like-using-stream-api.html