供应商的Lambda表达式,用于生成IntStream

sec*_*tar 8 java lambda java-8 java-stream

如何Supplier使用lambda表达式替换此处的代码

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);
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是:

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

Nik*_*las 8

Stream::generate不适合这个问题.根据文件:

这适用于生成恒定流,随机元素流等.


Had*_*i J 5

或者你可以使用它

IntStream.iterate(1, i -> i + 1)
 .limit(10)
 .forEach(System.out::println);  
Run Code Online (Sandbox Code Playgroud)

  • 呀,我理想情况下比`generate`更喜欢这个,然后是`iterate`的Java9版本.(1) (2认同)
  • 使用IntStream.iterate而不是Stream.iterate来提高效率. (2认同)

Nam*_*man 3

如果你一定要专门使用的话,就像这样Stream.generate

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

编辑:使用IntStream.generate,您可以将其执行为

IntStream.generate(new AtomicInteger(1)::getAndIncrement).limit(10);
Run Code Online (Sandbox Code Playgroud)

注意:就 API 设计而言,更好的解决方案肯定是用于Stream.iterate此类用例。

  • 我不明白为什么你必须在这里使用“map”。OP 显示了代码最终生成了一个 `IntStream`,因此,值得指出的是,首先创建一个 `Stream&lt;Integer&gt;`,然后调用 `.mapToInt(t -&gt; t)`,更加复杂*而且*更少比直接的方法更有效。如果你确实需要一个 `Stream&lt;Integer&gt;`,使用 `IntStream.generate(new AtomicInteger(1)::getAndIncrement) .limit(10) .boxed()` 仍然比使用 `map` 更简单。 (5认同)
  • 我喜欢 `new AtomicInteger(1)::getAndIncrement` 方法参考 - 太舒服了:) (2认同)