供供应商生成IntStream的Lambda表达式

时间:2018-12-01 15:07:40

标签: java lambda java-8 java-stream

如何使用lambda表达式替换此处的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 :(得分:8)

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);
    

答案 1 :(得分:5)

或者您可以使用

IntStream.iterate(1, i -> i + 1)
 .limit(10)
 .forEach(System.out::println);  

答案 2 :(得分:3)

如果您必须专门使用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