Object Oriented Programming (OOP) in Java - PDF
Document Details
Uploaded by Deleted User
Università degli Studi di Ferrara
Carlo Contino – Simone Giuliani
Tags
Summary
These are lecture notes for a course on Object Oriented Programming (OOP) in Java. The notes cover the OOP model and introduce some example Java programs. The document is from the University of Ferrara, Italy.
Full Transcript
Object Oriented Programming Carlo Contino – Simone Giuliani 1 Programmazione orientata agli oggetti Il modello di Java OOP in Java ...
Object Oriented Programming Carlo Contino – Simone Giuliani 1 Programmazione orientata agli oggetti Il modello di Java OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 2 Caratteristiche di Java La sintassi di Java è derivata da quella del C, la più diffusa, con alcune differenze significative che evidenzieremo nell’esposizione del linguaggio Java è generalmente considerato un linguaggio orientato agli oggetti “puro”, aderente quindi ai concetti della OOP "classica” in cui tutto è un oggetto Tuttavia il suo modello si discosta per alcuni aspetti dalla visione “classica” Si tratta per lo più di estensioni: nel corso del tempo il modello OOP si è arricchito di concetti nuovi e spesso molto importanti C’è anche qualche compromesso legato a motivi di efficienza OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 3 Modello OOP “classico”: Il concetto di oggetto Un oggetto è un’entità dotata di stato e di comportamento In pratica un oggetto aggrega in un'entità unica e indivisibile una struttura dati (stato) e l’insieme di operazioni che possono essere svolte su di essa (comportamento) E’ quindi un insieme di variabili e di procedure: le variabili vengono comunemente chiamate attributi dell’oggetto Le procedure vengono comunemente chiamate metodi Sparisce il dualismo di fondo del modello procedurale (dati e operazioni sui dati, non sono separati, ma aggregati) OOP – Modello classico Object Oriented Programming Carlo Contino – Simone Giuliani 4 Modello OOP “classico”: Classi e oggetti Abbiamo bisogno di un meccanismo che ci consenta di: Definire una struttura e un comportamento Creare un numero qualunque di oggetti con identica struttura e comportamento, ma con identità diversa Nella programmazione procedurale abbiamo il concetto di tipo: una volta definito un tipo possiamo dichiarare più variabili identiche fra di loro Serve anche un meccanismo di creazione, che allochi lo spazio per lo stato di ogni oggetto (in modo simile alle variabili dinamiche del C …) Nell’OOP questi due ruoli vengono svolti da un’entità chiamata classe OOP – Modello classico Object Oriented Programming Carlo Contino – Simone Giuliani 5 Esempi di Programmazione OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 6 Esempio: Counter public class Counter { private int val; public void reset() {val=0; } public void inc(){val++; } public int getValue() { return val;} } Contenuta nel file sorgente Counter.java OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 7 Classi in Java Una classe Java è una entità sintatticamente simile alle struct però, descrive non solo i dati..... ma anche le funzioni che operano su quei dati e ne specifica il livello di protezione pubblico: visibile anche dall’esterno privato: visibile solo entro la classe... Object Oriented Programming Carlo Contino – Simone Giuliani 8 Programma Java Un programma Java è un insieme di classi non esistono funzioni definite (come in C) a livello esterno, né variabili globali esterne anche il main è un metodo definito dentro a una classe Esiste una corrispondenza tra nomi delle classi (pubbliche) e file sorgente Esiste una corrispondenza tra nomi delle classi e file compilato OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani Approccio Java alla compilazione – byte code JAVAC Sorgente Compilatore BYTE-CODE Byte Code Rete o File System Loader Verificatore JAVA Interprete Generatore di Codice - Compilatore Byte Code Hardware Object Oriented Programming Carlo Contino – Simone Giuliani 10 UML e Modellazione Object Oriented Programming Carlo Contino – Simone Giuliani 11 Notazione grafica UML UML (Unified Modeling Language, "linguaggio di modellazione unificato") è un linguaggio di modellazione e specifica basato sul paradigna object-oriented Nucleo del linguaggio definito nel 1996 da Grady Booch, Jim Rumbaugh e Ivar Jacobson sotto l'egida dello OMG, che tuttora gestisce lo standard di UML Standard industriale unificato Gran parte della letteratura OOP usa UML per descrivere soluzioni analitiche e progettuali in modo sintetico e comprensibile OOP – Modello classico Object Oriented Programming Carlo Contino – Simone Giuliani 12 UML: Diagramma delle classi Classe In UML le classi vengono rappresentate con un rettangolo Nella forma sintetica compare solo il nome della classe mentre nella forma estesa vengono indicati anche i campi e i metodi Classe -Campo1 -Campo2 I caratteri + e – davanti ai metodi e ai campi indicano la +Metodo1() visibilità: +Metodo2() - sta per private +Metodo3() + sta per public OOP – Modello classico Object Oriented Programming Carlo Contino – Simone Giuliani 13 Compilazione ed Esecuzione in Java Object Oriented Programming Carlo Contino – Simone Giuliani 14 Classi in Java: metodi statici In Java le classi hanno anche un’altra capacità: possono fornire servizi indipendenti dalla creazione di istanze E’ infatti possibile definire dei metodi (individuati dalla parola chiave static) che possono essere invocati anche se non esiste alcuna istanza Esempio modulo Contatore OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 15 Programmi in Java Un programma Java è costituito da un insieme di classi Per convenzione deve esistere almeno una classe, definita come pubblica, che implementi un metodo static (cioè un metodo che può essere invocato anche in assenza di istanze) chiamato main() Questo metodo ha lo stesso ruolo della funzione main nei programmi C Il fatto che il metodo sia static fa sì che esso sia un metodo di classe e consente al sistema di invocarlo alla partenza del programma, quando non esiste alcuna istanza di alcuna classe. OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 16 main() Il main in Java è un metodo statico e pubblico (di una classe pubblica) con la seguente interfaccia obbligatoria: public static void main(String[] args){...... } Deve essere dichiarato public, static Non può avere valore restituito (è void) Deve sempre prevedere gli argomenti dalla linea di comando, anche se non vengono usati, sotto forma di array di String (il primo non è il nome del programma) Il più semplice programma Java è costituito quindi da una sola classe, pubblica, che ha solo il metodo main OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 17 Esempio 0 - Hello world! Vediamo un primo programma, il più semplice, che scrive "Hello World" in Java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } System.out.println() è un metodo messo a disposizione da una delle classi di sistema (System.out) e consente di scrivere sul video OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 18 Classi di sistema In C esiste una collezione di funzioni standard messe a disposizione dal sistema che prende il nome di libreria di sistema In Java, come nella maggior parte dei linguaggi ad oggetti, esiste invece una collezione di classi di sistema Abitualmente ci si riferisce all’insieme delle classi di sistema con il nome di framework Il framework di Java è molto ricco e comprende centinaia di classi che possono essere utilizzate per scrivere le proprie applicazioni Praticamente ogni applicazione Java fa uso di una o più classi di sistema OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 19 Classi e nomi In Java esiste una ben precisa corrispondenza fra nome di una classe pubblica nome del file in cui è definita Una classe pubblica deve essere definita in un file con lo stesso nome della classe ed estensione.java Esempio: classe HelloWorld → file HelloWorld.java In compilazione: file HelloWorld.java → file HelloWorld.class Object Oriented Programming Carlo Contino – Simone Giuliani 20 Compilazione – esecuzione il formato dei file.class (“bytecode”) non è direttamente eseguibile: è un formato portabile, inter-piattaforma per eseguirlo occorre un interprete Java è l’unico strato dipendente dalla piattaforma in questo modo si ottiene vera portabilità: un file.class compilato su una piattaforma può essere eseguito (via interpretazione) su qualunque altra Si perde un po’ in efficienza, ma si guadagna in portabilità Object Oriented Programming Carlo Contino – Simone Giuliani Compilazione – esecuzione HelloWorld.java JAVAC Compilatore HelloWorld.class BYTE-CODE File System Loader Verificatore JAVA Interprete Generatore di Codice - Compilatore Byte Code Hardware Object Oriented Programming Carlo Contino – Simone Giuliani 22 Ispezioniamo il bytecode Ecco cosa mostra il comando javap -c HelloWorld.class Compiled from "HelloWorld.java" Istruzioni della Java Virtual public class HelloWorld { Machine public HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #13 // String Hello world! 5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return } Object Oriented Programming Carlo Contino – Simone Giuliani 23 Java Virtual Machine e JIT Compilation Object Oriented Programming Carlo Contino – Simone Giuliani Architettura Java Virtual Machine Java Virtual Machine (Hotspot) ha tre sottosistemi principali: class loading, memory management ed execution engine. Si noti che Java è un linguaggio garbage collected: la gestione della memoria spetta alla JVM non al programmatore come in C (malloc). Courtesy: A. B. Vijay Kumar, «Supercharge Your Applications with GraalVM», Packt Publishing, 2021 Object Oriented Programming Carlo Contino – Simone Giuliani JIT Compilation – C1 e C2 Più precisamente, la Java Virtual Machine (Hotspot) ha due livelli di compilatori JIT (da bytecode a codice macchina): C1 e C2. Courtesy: A. B. Vijay Kumar, «Supercharge Your Applications with GraalVM», Packt Publishing, 2021 Object Oriented Programming Carlo Contino – Simone Giuliani 26 Compilazione – esecuzione Usando il JDK: Compilazione: javac HelloWorld.java (produce HelloWorld.class) Esecuzione (interpretazione): java HelloWorld Non esiste una fase di link esplicita, Java adotta il collegamento dinamico, sfruttando la corrispondenza tra nome della classe e nome del componente compilato in bytecode Object Oriented Programming Carlo Contino – Simone Giuliani 27 Java Development Kit (JDK) Object Oriented Programming Carlo Contino – Simone Giuliani 28 Java Development Kit (JDK) Sono disponibili diversi compilatori, o meglio Java Development Kit (JDK). I principali sono Oracle JDK, OpenJDK ed Eclipse Adoptium Temurin. È possibile, e in alcuni casi opportuno o addirittura inevitabile, installare diversi JDK nella stessa macchina Strumenti come jenv (https://www.jenv.be/) permettono di passare facilmente tra le diverse versioni di JDK presenti sulla macchina Ai fini di questo insegnamento, qualsiasi SDK relativamente recente (versione >= 17) è sufficiente ma vi raccomando caldamente Temurin Potete verificare la versione attuale con il comando: java –version Object Oriented Programming Carlo Contino – Simone Giuliani 29 Oracle Java SE Development Kit Oracle è l’azienda che porta avanti lo sviluppo di Java e offre supporto commerciale Java originariamente sviluppato in Sun Microsystem nella prima metà degli anni ‘90 Oracle Java SE Development Kit (JDK) è la versione commerciale di Java, che si basa sugli stessi sorgenti di OpenJDK. Oracle fornisce aggiornamenti aggiornamenti regolari e patch di sicurezza per le build di SE JDK. Il problema principale con Oracle SE JDK è la politica di licenza di Oracle. In pratica, se non avete intenzione di sottoscrivere un contratto di supporto con Oracle dovreste evitare SE JDK. Potete scaricare Oracle JDK SE Development Kit da: https://www.oracle.com/java/technologies/downloads/ Object Oriented Programming Carlo Contino – Simone Giuliani 30 Oracle JDK Releases Ciclo di release drammaticamente cambiato negli ultimi anni: Release normali senza supporto e Long Term Support (LTS) con 8 anni di supporto garantiti Possibilità di utilizzo gratuito estremamente limitata Object Oriented Programming Carlo Contino – Simone Giuliani 31 OpenJDK Oracle fornisce anche build con licenza open source di Java (GPLv2 con Classpath Exception), chiamate OpenJDK OpenJDK è disponibile per tutte le piattaforme principali: winget install -e --id ojdkbuild.ojdkbuild brew install openjdk apt install openjdk-20-jdk Le build OpenJDK vengono aggiornate solo per un periodo di 6 mesi. Dopo questo breve periodo gli aggiornamenti e le patch di sicurezza non saranno disponibili. Questo vale anche per le versioni LTS! Per ulteriori informazioni: https://jdk.java.net/ Object Oriented Programming Carlo Contino – Simone Giuliani 32 Eclipse Adoptium Eclipse Adoptium è un progetto di alto livello nell'ambito della Eclipse Foundation, che fornisce risorse e un modello di governance professionale per il software open source. Il gruppo di lavoro Adoptium è composto dalle principali aziende e organizzazioni che hanno un interesse strategico nella tecnologia Java, tra cui Red Hat, IBM, Microsoft, Azul e i Java User Group (JUG). Il precedente progetto AdoptOpenJDK è passato a Eclipse Adoptium. Object Oriented Programming Carlo Contino – Simone Giuliani 33 Eclipse Adoptium Temurin Le build di Adoptium OpenJDK sono chiamate Eclipse Temurin (anagramma di «runtime») per distinguere il progetto dalle build Le build di Eclipse Temurin sono di alta qualità, indipendenti dal vendor, esplicitamente testate per passare il test di compatibilità con JDK e hanno una licenza permissiva https://adoptium.net/temurin/releases/ Disponibili anche immagini Docker ufficiali https://hub.docker.com/_/eclipse-temurin/ Adoptium afferma che continuerà a creare binari per le versioni LTS fintanto che la sorgente upstream corrispondente verrà mantenuta attivamente Object Oriented Programming Carlo Contino – Simone Giuliani 34 Installare Eclipse Adoptium Temurin su Ubuntu La procedura è su https://askubuntu.com/a/1386901 Aggiungete la Eclipse Adoptium GPG key wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add – Aggiungete il repository ufficiale echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list Installate la versione di Temurin che preferite sudo apt update sudo apt install temurin-17-jdk Configurate Temurin come versione di default sudo update-alternatives --config java Object Oriented Programming Carlo Contino – Simone Giuliani 35 Installare Eclipse Adoptium Temurin su MacOS Con il package manager Homebrew l’installazione è davvero semplicissima Per la versione 17: brew tap homebrew/cask-versions brew install --cask temurin17 Si ricorda che è consigliabile l’uso di strumenti dedicati, come jenv, per gestire diverse versioni del JDK Object Oriented Programming Carlo Contino – Simone Giuliani 36 Installare Eclipse Adoptium Temurin su Windows Potete scaricare e installare i binari da https://adoptium.net/temurin/releases/ oppure usare il vostro package manager preferito Con winget l’installazione è davvero semplicissima: winget install -e --id EclipseAdoptium.Temurin.17.JDK Object Oriented Programming Carlo Contino – Simone Giuliani 37 Riferimenti e Oggetti in Java Object Oriented Programming Carlo Contino – Simone Giuliani 38 Sito https://whichjdk.com Object Oriented Programming Carlo Contino – Simone Giuliani 39 Esempio: descrizione e modello Proviamo a scrivere un’applicazione più complessa che fa uso di due classi: la classe che definisce il metodo main() e la classe Counter definita in precedenza. Nel metodo main() creeremo un’istanza di Counter e invocheremo alcuni metodi su di essa Il diagramma delle classi sottostante rappresenta la struttura Counter dell’applicazione (la linea di collegamento nel diagramma delle classi UML -val : int ci dice che Esempio “usa” Counter) +reset() : void +inc() : void +getValue() : int Esempio +main() : void OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 40 Esempio: implementazione public class Counter { private int val; public void reset() { val = 0; } public void inc(){ val++; } public int getValue() { return val;} } public class Esempio { public static void main(String[] args) { int n; Counter c1; c1 = new Counter(); c1.reset(); c1.inc(); n = c1.getValue(); c1 = null; System.out.println(n); } } OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 41 Passo 1: dichiarazione del riferimento Java, come tutti i linguaggi ad oggetti, consente di dichiarare variabili che hanno come tipo una classe Counter c1; In Java, queste variabili sono riferimenti ad oggetti (in qualche modo sono dei puntatori). Attenzione! La dichiarazione della variabile non implica la creazione dell’oggetto: la variabile c1 è a questo punto è solo un riferimento vuoto (un puntatore che non punta da nessuna parte) c1 OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 42 Passo 2: creazione dell’oggetto Per creare l’oggetto devo utilizzare un’istruzione apposita che fa uso della parola chiave new c1 = new Counter(); A questo punto, e non prima, ho a disposizione un’area di memoria per l’oggetto (un’istanza di Counter) Il nome c1 è un riferimento a questa area L’oggetto è di fatto una variabile dinamica, allocata nel’ HEAP HEAP c1 Istanza di Counter OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 43 Passo 3: uso dell’oggetto A questo punto abbiamo un oggetto ed un riferimento a questo oggetto (la variabile c1) Possiamo utilizzare il riferimento per invocare i metodi pubblici dell’oggetto utilizzando la cosiddetta “notazione puntata”:. Per esempio: c1.inc(); n = c1.getValue(); Dal momento che c1 è di “tipo” Counter, il compilatore, basandosi sulla dichiarazione della classe Counter può determinare quali sono i metodi invocabili (quelli dichiarati come pubblici) Notazione semplificata, dereferencing implicito OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 44 Passo 4: distruzione dell’oggetto Non occorre distruggere manualmente l’oggetto, in Java esiste un componente del sistema, chiamato garbage collector che distrugge automaticamente gli oggetti quando non servono più Come fa il garbage collector a capire quando un oggetto non serve più? Un oggetto non serve più quando non esistono più riferimenti ad esso c1 è una variabile locale del metodo main(): quando il metodo main() termina c1 non esiste più Quindi non esistono più riferimenti all’oggetto che abbiamo creato e il garbage collector può distruggerlo OOP in Java c1 X Istanza di Counter Object Oriented Programming Carlo Contino – Simone Giuliani 45 Esempio 2: implementazione public class Counter { private int val; public void reset() { val = 0; } public void inc(){ val++; } public int getValue() { return val;} } public class Esempio { public static void main(String[] args) { int n; Counter c1; c1 = new Counter(); c1.inc(); n = c1.getValue(); System.out.println(n); } } OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 46 Compilazione Usando il JDK: Compilazione: javac Counter.java Esempio.java (produce Esempio.class e Counter.class) Esecuzione: java Esempio Object Oriented Programming Carlo Contino – Simone Giuliani 47 Passaggio dei Parametri Object Oriented Programming Carlo Contino – Simone Giuliani 48 Passaggio dei parametri - 1 Java passa i parametri per valore: all’interno di un metodo si lavora su una copia Finché parliamo di tipi primitivi non ci sono particolarità da notare (sono scalari, come in C sono passati per valore!) Per quanto riguarda invece i riferimenti agli oggetti la cosa richiede un po’ di attenzione: Passando un riferimento come parametro questo viene ricopiato Ma la copia punta all’oggetto originale! In poche parole: passare per valore un riferimento significa passare per riferimento l’oggetto puntato! OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 49 Passaggio dei parametri - 2 Quindi: Un parametro di tipo primitivo viene copiato, e la funzione riceve la copia Un riferimento viene copiato, la funzione riceve la copia, cioè l'indirizzo di un oggetto, e con ciò accede all’oggetto originale! Ovvero, in Java: I tipi primitivi vengono passati sempre per valore Gli oggetti vengono passati sempre per riferimento OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani 50 Bibliografia Object Oriented Programming Carlo Contino – Simone Giuliani 51 Bibliografia Libri consigliati: Siti consigliati: K. Sierra et al., «Head First Java», 3rd https://dev.java/ e https://dev.java/learn/ Edition, O’Reilly, 2022 https://inside.java/ B. Evans et al., «The Well-Grounded Java Developer», 2nd Edition, Manning, 2022 J. Bloch, «Effective Java», 3rd Edition, O’Reilly, 2017 R.-G. Urma et al., «Modern Java in Action: Lambdas, Streams, Functional and Reactive Programming», Manning, 2018 OOP in Java Object Oriented Programming Carlo Contino – Simone Giuliani Confronto tra Java e C++ Object Oriented Programming Carlo Contino – Simone Giuliani 2 Java come linguaggio OOP puro Orientato agli oggetti Panoramica su Sintassi derivata dal linguaggio C Java Differenze sostanziali rispetto a C e C++ Java non è solo una versione migliorata di C++ Ha caratteristiche uniche che lo distinguono Object Oriented Programming Carlo Contino – Simone Giuliani 3 Fondamenti di Java Object Oriented Programming Carlo Contino – Simone Giuliani 4 Caratteristiche di Java Portabilità Codice Java compilato in bytecode Eseguibile su qualsiasi piattaforma con JVM Garantisce un alto livello di portabilità Puro OOP Tutto in Java è un oggetto Adesione al modello di programmazione orientata agli oggetti Java introduce estensioni per maggiore efficienza Object Oriented Programming Carlo Contino – Simone Giuliani 5 Definizione della classe La classe è denominata HelloWorld Metodo principale Hello World in Il metodo main è il punto di ingresso del programma Java Accetta un array di stringhe come argomento Stampa a console System.out.println stampa 'Hello world!' sulla console Object Oriented Programming Carlo Contino – Simone Giuliani 6 Metodo main in Java Parte di una classe Deve essere dichiarato statico Assenza di funzioni o variabili globali in Java Differenze con Tutto deve essere definito all'interno di una classe C++ Programma Hello World in C++ Può esistere fuori da una classe Codice di esempio: #include int main() { std::cout System.out.println("Chiave: " + key + ", Valore: " + value) ); Esempio con filtro: map.entrySet().stream().filter(entry -> entry.getValue() > 100) // Filtra valori maggiori di 100.forEach(entry -> System.out.println("Chiave: " + entry.getKey() + ", Valore: " + entry.getValue()) ); 28 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 29 Operazione Map L'operazione map() è usata per trasformare gli elementi di uno stream applicando una funzione a ciascun elemento e restituendo uno stream di elementi trasformati. Esempio 1: Trasformare una Lista di Stringhe in Maiuscolo List list = Arrays.asList("java", "stream", "map"); List upperCaseList = list.stream().map(String::toUpperCase) // Trasforma ogni stringa in maiuscolo.collect(Collectors.toList()); System.out.println(upperCaseList); // Output: [JAVA, STREAM, MAP] 29 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 30 Operazioni Map (esempio 2) Esempio 2: Trasformare una Lista di Numeri in una Lista di Quadrati List numbers = Arrays.asList(1, 2, 3, 4, 5); List squaredNumbers = numbers.stream().map(n -> n * n) // Eleva ogni numero al quadrato.collect(Collectors.toList()); System.out.println(squaredNumbers); // Output: [1, 4, 9, 16, 25] 30 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 31 Operazione Reduce L'operazione reduce() è usata per combinare tutti gli elementi di uno stream in un singolo risultato, applicando ripetutamente una funzione di combinazione. Esempio 1: Sommare gli Elementi di una Lista List numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().reduce(0, Integer::sum); // Somma tutti i numeri System.out.println(sum); // Output: 15 31 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 32 Operazione Reduce (esempio 2) Esempio 2: Moltiplicare gli Elementi di una Lista List numbers = Arrays.asList(1, 2, 3, 4, 5); int product = numbers.stream().reduce(1, (a, b) -> a * b); // Moltiplica tutti i numeri System.out.println(product); // Output: 120 32 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 33 Combinazione di Map e Reduce Spesso, puoi utilizzare map per trasformare i dati e reduce per combinare i risultati in un unico valore. Esempio: Sommare i Quadrati degli Elementi di una Lista List numbers = Arrays.asList(1, 2, 3, 4, 5); int sumOfSquares = numbers.stream().map(n -> n * n) // Trasforma ogni numero nel suo quadrato.reduce(0, Integer::sum); // Somma i quadrati System.out.println(sumOfSquares); // Output: 55 33 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 34 Esempio: Concatenare Stringhe In questo esempio, vediamo come usare reduce per concatenare una lista di stringhe con un delimitatore. List words = Arrays.asList("Java", "Stream", "API"); String concatenatedString = words.stream().reduce((s1, s2) -> s1 + " - " + s2) // Concatenazione con delimitatore.orElse(""); // Ritorna una stringa vuota se la lista è vuota System.out.println(concatenatedString); // Output: Java - Stream - API 34 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 35 Trasformare una Map in una List usando un Ciclo While In questo esempio, useremo un ciclo while per iterare su una Map e aggiungere gli elementi a una List. Qui scegliamo di convertire le voci (Map.Entry) della mappa in una lista. Esempio: Usare un Ciclo While Map map = new HashMap(); map.put("Chiave1", 100); map.put("Chiave2", 200); map.put("Chiave3", 300); List list = new ArrayList(); Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { list.add(iterator.next()); } System.out.println(list); // Output: [Chiave1=100, Chiave2=200, Chiave3=300] 35 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 36 Trasformare una Map in una List usando gli Stream Map map = new HashMap(); map.put("Chiave1", 100); map.put("Chiave2", 200); map.put("Chiave3", 300); List list = map.entrySet().stream().collect(Collectors.toList()); System.out.println(list); // Output: [Chiave1=100, Chiave2=200, Chiave3=300] 36 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 37 Altri esempi Estrarre chiavi e valori List keyList = map.keySet().stream().collect(Collectors.toList()); System.out.println(keyList); // Output: [Chiave1, Chiave2, Chiave3] Estrarre solo valori List valueList = map.values().stream().collect(Collectors.toList()); System.out.println(valueList); // Output: [100, 200, 300] 37 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 38 Potenzialità degli Stream in Java Gli Stream sono una nuova API introdotta in Java 8 per lavorare con collezioni di dati in modo funzionale e dichiarativo. Gli Stream permettono di eseguire operazioni su sequenze di dati senza modificare la sorgente. Vantaggi principali: Conciso e leggibile: Operazioni come filtraggio, mappatura, e riduzione sono eseguite in modo dichiarativo. Lazy Evaluation: Le operazioni sugli stream sono eseguite solo quando necessario (quando si chiama un' 38 Object Oriented Object Programming Oriented Programming CarloCarlo Contino Contino – SimoneGiuliani – Simone Giuliani 39 Parallelismo con parallelStream Il metodo parallelStream() consente di sfruttare il parallelismo per elaborare collezioni di dati in modo parallelo, migliorando le prestazioni su sistemi multi-core. Vantaggi del parallelStream: Esecuzione parallela: Suddivide automaticamente il lavoro su più thread, riducendo i tempi di esecuzione per grandi quantità di dati. Semplicità d'uso: Basta chiamare.parallelStream() su una collezione esistente. List numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum(); 39 Object Oriented Programming Carlo Contino – Simone Giuliani 1 Strutture dati in C++ Panoramica su Array, Vector, Map e List Strutture dati Object Oriented Programming Carlo Contino – Simone Giuliani 2 Gli array in C++ Una collezione di elementi dello stesso tipo, accessibili tramite un indice int data; Int num = {0, 1}; std::string str = {"ciao", "mondo"}; Multidimensionalità int data; long triple; Strutture dati Object Oriented Programming Carlo Contino – Simone Giuliani 3 Gli array in C++ Accesso e modifica int data = {15, 30, 45}; int num = data; //num = 15 for (int i : data) { cout