几种编程语言(例如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;@Overridepublic 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