Несколько языков программирования, таких как 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
|
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, которые затем сортируются и сохраняются в виде массива.
Ссылка: | Java похож на выход, используя Stream API от нашего партнера по JCG Серхио Молина из блога TODOdev . |