Java 8中的Lambda表达式

Héc*_*orn 11 java lambda

我想使用lambda表达式而不是for循环生成数字列表.

所以,假设我要生成一个100以下的所有三角数列表.三角数是遵循以下公式的数字:(n*n + n)/ 2

这样做的最佳方式是什么?目前我有这个:

    Stream.iterate(1, n -> n + 1).limit(100)
            .map(n -> (n * n + n) / 2)
            .filter(a -> a < 100)
            .map(a -> a + "")
            .collect(Collectors.joining(", ", "Numbers: ", "."));
Run Code Online (Sandbox Code Playgroud)

但这似乎不必要地计算量太多了.我迭代n超过1到100(因为我假设我不知道n的最大值是什么),然后我映射该列表的三角数函数然后我检查哪些数字在100以下.是否有更有效的方法这样做?另外:我可以仅使用Stream的迭代函数生成三角形数字而不是使用迭代,限制然后映射吗?

编辑:所以这里的要点是:一旦三角形数字之一超过100,如何计算traingle数字? 通常我会这样写:

ArrayList<Integer> triangles = new ArrayList<>(); 
for (int n=1;true;n++) {
    int num = (n*n+n)/2;

    if (num>100) break;

    triangles.add(num);
}
Run Code Online (Sandbox Code Playgroud)

一旦三角形数超过100就停止,这是非常有效的; 如何在lambda表达式中保留这种效率?

hot*_*key 6

一般情况下,您正在寻找的是需要的时间.不幸的是,它在Java 8流中没有默认实现.查看有关take-while问题.

  • 它正在为Java 9工作. (3认同)
  • Java 9 中添加了“takeWhile”。 (3认同)