我希望使用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: ", "."));
但这似乎是不必要的过度计算量。我迭代n从1到100(因为假设我不知道n的最大值),然后我映射该列表的三角形数函数,然后我检查哪些数字在100以下。有更有效的方法吗?
另外: 我是否可以仅使用Stream的iterate函数生成三角形数,而不是使用iterate、limit和map?
编辑:因此,这里的主要问题是:如何在一个三角形数超过100时停止三角形数的计算?通常我会这样写:
ArrayList<Integer> triangles = new ArrayList<>();
for (int n=1;true;n++) {
int num = (n*n+n)/2;
if (num>100) break;
triangles.add(num);
}
一旦三角形数字超过100,它就会停止,非常高效;我如何在lambda表达式中保留这种效率?
Stream.iterate(1, n->n+1).limit(100)
可以重写为IntStream.rangeClosed(1, 100)
,这样可能更易读。 - Pshemo