java - Java 8 中的 Lambda 表达式

标签 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: ", "."));

但这对于计算量来说似乎不必要地矫枉过正。我在 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/

相关文章:

java - 如何布局组件,使中间组件获得所有空间,但最右边的组件左对齐?

java - 输入 "exit"后获取 java.util.InputMismatch

java - 在 Eclipse 中自动生成 getter 和 setter 的注释

android - 将扩展函数包装到另一个函数中

c++ - 如何包装 C++11 回调?

java - 在groovy中扩展LinkedHashMap时如何覆盖equals

java - 将所有 Person 对象添加到组合框中

Java 11 : Local-Variable Syntax for Lambda Parameters - applications

c++ - VC++ 15 为 lambda 捕获调用了错误的复制构造函数?

c - 这个C代码怎么会有lambda