Voglio generare un elenco di numeri utilizzando espressioni lambda e non un ciclo for.Espressioni lambda in Java 8
Quindi diciamo che voglio generare un elenco di tutti i numeri triangolari sotto 100. numeri triangolari sono numeri che seguono la formula: (n * n + n)/2
Qual è il modo migliore di fare questo ? Attualmente ho questo:
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: ", "."));
ma questo sembra inutilmente eccessivo con la quantità di calcoli. Ripetere iterando da 1 a 100 (poiché supponiamo di non sapere quale sia il valore massimo per n), quindi mappo la funzione del numero triangolare di quell'elenco e poi controllo quali numeri hanno meno di 100. Esiste un modo più efficiente nel fare questo? Inoltre: posso generare i numeri dei triangoli usando solo la funzione iterate di Stream invece di usare iterate, limit e quindi mappare?
MODIFICA: Quindi il punto principale è: in che modo il calcolo dei numeri di coda può interrompersi non appena uno dei numeri del triangolo supera 100? solito avrei scritto così:
ArrayList<Integer> triangles = new ArrayList<>();
for (int n=1;true;n++) {
int num = (n*n+n)/2;
if (num>100) break;
triangles.add(num);
}
che ferma non appena un numero triangolo supera 100, che è molto efficiente; come posso mantenere questa efficienza nell'espressione lambda?
'Stream.iterate (1, n-> n + 1) .limit (100)' può essere riscritto come 'IntStream.rangeClosed (1, 100)' che è probabilmente più leggibile. – Pshemo
perché stai usando sia un limite che un filtro?Credo che il secondo filtro limiterà l'output in base al calcolo, quindi otterrete solo risultati inferiori a 100, anziché input inferiori a 100. –
Qual è il punto? O è solo curiosità? – doublep