Я хочу сгенерировать список чисел с использованием лямбда-выражений, а не для цикла.Лямбда-выражения в Java 8
Итак, давайте скажем, я хочу, чтобы создать список всех треугольных чисел под 100. треугольных чисел числа, которые следуют по формуле: (п * п + п)/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: Таким образом, основной смысл здесь: Как можно вычислить количество колеровочных номеров, как только один из чисел треугольника превышает 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, который является очень эффективным; как я могу сохранить эту эффективность в лямбда-выражении?
'Stream.iterate (1, n-> n + 1) .limit (100)' можно переписать как «IntStream.rangeClosed (1, 100)», что, вероятно, более читаемо. – Pshemo
Почему вы используете как предел, так и фильтр?Я считаю, что второй фильтр ограничит вывод на основе расчета, поэтому вы получите только результаты, которые меньше 100, а не меньше 100. –
В чем смысл? Или это просто любопытство? – doublep