Originariamente inviata da
cofra347
credo che il programmatore abbia voluto strafare
Non è questione di "strafare". Con lambda expression/method reference e la Stream API è possibile scrivere codice più compatto, PIÙ leggibile e nell'ottica di una programmazione più "funzionale".
Se hai un array di nomi:
codice:
String[] nomiColleghi = {
"Andrea", "Cecilia", "Claudio", "Damiano", "Davide",
"Emanuele", "Enrico", "Giorgio", "Giuseppe", "Liliana",
"Luigi", "Maurizio", "Michele", "Paolo", "Sara", "Serena",
"Simona", "Simone"
};
E vuoi ottenere un List con i nomi lunghi al massimo 6 caratteri e portati tutti in maiuscolo, puoi fare normalmente:
codice:
List<String> res = new ArrayList<String>();
for (String nome : nomiColleghi) {
if (nome.length() <= 6) {
res.add(nome.toUpperCase());
}
}
Oppure con Stream API+lambda expression:
codice:
List<String> res = Arrays.stream(nomiColleghi)
.filter(nome -> nome.length() <= 6)
.map(String::toUpperCase)
.collect(Collectors.toList());
La vedi la differenza? Quest'ultimo è più compatto e leggibile. Qui c'è solo un "filtro" e un "mapping", che effettivamente sono banali, ma immagina ci siano operazioni anche di grouping e altro.
Se il codice lo scrivi tu "a mano" con cicli, if, ecc.. il codice diventa lungo, prolisso, quasi sicuramente poco leggibile e anche dispersivo. E oltretutto NON (facilmente) parallelizzabile.
Invece se avessi un array con 20000 nomi, puoi usare un parallel stream mettendo semplicemente:
Arrays.stream(nomiColleghi).parallel().blabla
Dato che la sorgente dei dati è un array, la parallelizzazione è molto efficace. E ti permette di sfruttare i core del processore. Se invece scrivi tu for, if, il tuo codice non è di per sé parallelizzabile. Per renderlo parallelizzabile, bisogna avere nozioni abbastanza elevate sul multi-threading/concorrenza. E dovresti ripetere la cosa o in più posti (non buono) o farti una piccola architettura che sarebbe sostanzialmente similare a quella della Stream API.
Più chiaro, ora?