Лямбда-выражение для поставщика для генерации IntStream - PullRequest
0 голосов
/ 01 декабря 2018

Как заменить здесь Supplier код лямбда-выражением

IntStream inStream = Stream.generate(new Supplier<Integer>() {
    int x= 1;
    @Override
    public Integer get() {
        return x++ ;
    }
}).limit(10).mapToInt(t -> t.intValue());
inStream.forEach(System.out::println);

Вывод приведенного выше фрагмента кода:

1
2
3
4
5
6
7
8
9
10

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Stream::generate не подходит для этой проблемы.Согласно документации:

Подходит для генерации постоянных потоков, потоков случайных элементов и т. Д.

  • Возможно, вы захотите использовать скорееIntStream::range:

    IntStream intStream = IntStream.range(1, 11);
    intStream.forEach(System.out::println);
    
  • Другим решением может быть использование IntStream.iterate, где вы можете удобно управлять приращением, используя IntUnaryOperator:

    IntStream intStream = IntStream.iterate(1, i -> i+1).limit(10);
    intStream.forEach(System.out::println);
    
  • Как уже говорилось, Stream::generate подходит для постоянных потоков или случайных элементов.Случайный элемент может быть получен с использованием класса Random, поэтому здесь вы можете получить приращение, используя AtomicInteger:

    AtomicInteger atomicInteger = new AtomicInteger(1);
    IntStream intStream = Stream.generate(atomicInteger::getAndIncrement).limit(10);
    intStream.forEach(System.out::println);
    
0 голосов
/ 01 декабря 2018

Или вы можете использовать это

IntStream.iterate(1, i -> i + 1)
 .limit(10)
 .forEach(System.out::println);  
0 голосов
/ 01 декабря 2018

Примерно так, если вы обязаны использовать Stream.generate, в частности:

IntStream inStream = Stream.generate(new AtomicInteger(1)::getAndIncrement)
        .limit(10)
        .mapToInt(t -> t);
inStream.forEach(System.out::println);

Редактировать : Использование IntStream.generate, вы можете выполнить это как

IntStream.generate(new AtomicInteger(1)::getAndIncrement).limit(10);

Примечание : Лучшим решением с точки зрения дизайна API, безусловно, было бы сделатьиспользование Stream.iterate для такого варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...