Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1
    Un poco fuori tema, credo che il programmatore abbia voluto strafare, infatti più semplicemente, leggibilmente e efficientemente si sarebbe potuto usare il seguente algoritmo, in pseudocodice:

    codice:
    per ogni elemento "chiave" in autorizzazioni {
      arrayAutorizzazioni.add(Autorizzazioni.AUTORIZZAZIONI_ATTIVE[chiave] ) //prendi e aggiungi l'elemento con quella chiave
    }
    Forse questo funziona ma devo provarlo:

    codice:
    for (TipoAutorizzazione chiave: autorizzazioni) {
        arrayAutorizzazioni.add(Autorizzazioni.AUTORIZZAZIONI_ATTIVE.get(chiave));
    }
    Invece si serializza l'array delle chiavi, si creano filtri e un sacco di casini (senza aggiungere uno straccio di commento).

    Roba da matti, ma il mio scopo alla fine è comprenderlo come esempio didattico.
    Ultima modifica di cofra347; 17-11-2017 a 10:05
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cofra347 Visualizza il messaggio
    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?
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Capisco i motivi della parallelizzazione, per la leggibilità umana, forse ci si arriva con l'abitudine, a prima vista mi pare più leggibile il for scritto a mano.
    Il tuo esempio mi sembra invece chiaro anche con la nuova sintassi, al contrario di quello che ho incontrato io.

    Però, forse, abituàndocisi e vedendo sempre questa sintassi... vedremo col tempo, devo ancora digerire queste novità.
    Ultima modifica di cofra347; 17-11-2017 a 11:22
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cofra347 Visualizza il messaggio
    a prima vista mi pare più leggibile il for scritto a mano.
    Ignorando un momento la questione della parallelizzazione, se si tratta di un for+if (come nell'esempio sopra) in effetti è ragionevolmente "leggibile". Ci sono però scenari in cui è ben evidente come la Stream API renda una logica MOLTO più leggibile rispetto che farla "a mano". Appena ho tempo ti posto un esempio assolutamente "lampante".
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.