我想使用 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: ", "."));
但这对于计算量来说似乎不必要地矫枉过正。我在 1 到 100 之间迭代 n(因为假设我不知道 n 的最大值是多少),然后我映射该列表的三角形数函数,然后我检查哪些数字低于 100。是否有更有效的方法在做这个? 另外:我可以只使用 Stream 的迭代函数而不是使用迭代、限制然后映射来生成三角形数吗?
编辑: 所以这里的要点是:如何在其中一个三角形数超过 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 表达式中保持这种效率?
最佳答案
在一般情况下,您正在寻找的是 take-while。 不幸的是,它在 Java 8 流中没有默认实现。 查看question about take-while .
关于java - Java 8 中的 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30693975/