Несколько языков программирования, таких как Ruby или Python и другие, предоставляют команду yield . Выход обеспечивает эффективный способ, с точки зрения потребления памяти, для создания ряда значений, генерируя такие значения по требованию. Больше информации о Python Yield .
Давайте рассмотрим класс или метод, требующий огромное количество безопасных случайных целых чисел. Классический подход заключается в создании массива или коллекции таких целых чисел. Доходность обеспечивает два основных преимущества по сравнению с таким подходом:
- Урожайность не требует заранее знать длину серии.
- yield не требует хранить все значения в памяти.
К счастью, функции выхода можно использовать в Java 8 благодаря Stream API :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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; } }); }} |
Ниже приведен вывод после выполнения предоставленного фрагмента кода:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
SeedingGenerated random 0: -896358073Generated random 1: -1268521873Generated random 2: 9627917Generated random 3: -2106415441Generated random 4: 935583477Generated random 5: -1132421439Generated random 6: -1324474601Generated random 7: -1768257192Generated random 8: -566921081Generated random 9: 425501046-2106415441-1768257192-1324474601-1268521873-1132421439-896358073-5669210819627917425501046935583477 |
Легко видеть, что Поставщик только один экземпляр. Конечно, мы можем воспользоваться всеми функциями Stream API, такими как limit () и sorted ().
Строка randomInt.limit (RANDOM_INTS) .sorted (). ToArray () запускает генерацию значений RANDOM_INTS, которые затем сортируются и сохраняются в виде массива.
| Ссылка: | Java похож на выход, используя Stream API от нашего партнера по JCG Серхио Молина из блога TODOdev . |