Статьи

Java-подобный с использованием Stream API

Несколько языков программирования, таких как 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 .