Я хочу сгенерировать список чисел с использованием лямбда-выражений, а не для цикла.
Итак, скажем, я хочу сгенерировать список всех треугольных чисел под 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. Есть ли более эффективный способ в этом? Также: могу ли я генерировать числа треугольников, используя только функцию итерации потока вместо использования итерации, предела и затем отображения?
EDIT: Итак, главный смысл здесь: как можно вычислить числа traingle, как только одно из чисел треугольника превышает 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, что очень эффективно; как сохранить эту эффективность в лямбда-выражении?