Java Flashcards

1
Q

Cos’è uno stream in Java 8?

A

Uno Stream in Java è un’interfaccia introdotta con Java 8 che consente di operare su sequenze di dati in modo funzionale e dichiarativo. Gli Stream permettono di elaborare collezioni di dati (come liste, insiemi o array) in modo efficiente, eseguendo operazioni come il filtraggio, la mappatura, l’ordinamento, e l’aggregazione di dati, senza dover scrivere loop espliciti o manipolare manualmente le strutture dati.
Costituito da:
Collection (Lista)
List<Double> valori = Arrays.asList(1.3,2.4,4.4);</Double>

Sorgente (.stream())
* valori.stream();

operazioni intermedie
* map
* filter
* sorted

operazioni terminali
* collect (esegue ed assegna)
* forEach (esegue e basta)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

descrivi le lambda

A

Le lambda Expression ci consentono di dare corpo alle funzioni anonime scrivendo così codice più leggibile
Sono un modo conciso e potente di rappresentare funzioni anonime che possono essere usate come argomenti di metodi o assegnate a variabili. Le lambda expression permettono di scrivere codice più leggibile e flessibile, soprattutto quando si lavora con interfacce funzionali, ovvero interfacce con un unico metodo astratto.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Descrivi le classi astratte

A

Sono classi con parola chiave abstract: Le classi astratte possono contenere metodi completamente implementati, oltre a metodi astratti (con parola chiave abstract e senza implementazione). Un metodo astratto è dichiarato senza un corpo e deve essere implementato nelle sottoclassi concrete.
2. Possono contenere campi e variabili di istanza: Le classi astratte possono avere campi e variabili di istanza, che possono essere ereditati e utilizzati dalle sottoclassi.
3. Consentono ereditarietà singola: Una classe Java può estendere solo una classe astratta. Quindi, una classe astratta può essere utilizzata come una classe base per una sola sottoclasse.
4. Utilizzate per fornire una base comune: Le classi astratte vengono spesso utilizzate per fornire una base comune e condividere il codice tra diverse sottoclassi.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

descrivi le interfacce

A
  1. Sono completamente astratte: Le interfacce in Java contengono solo metodi astratti, cioè metodi senza implementazione. Forniscono solo la “firma” dei metodi e le classi che implementano l’interfaccia devono fornire l’implementazione effettiva.
  2. Non possono contenere campi o variabili di istanza: Le interfacce possono dichiarare solo costanti (campi statici final) e metodi astratti.
  3. Da java 8 possono contenere metodi default facoltativamente le sottoclassi possono sovrascrivere i metodi di default.
  4. una sottoclasse può non sovrascrivere tutti i metodi astratti soltanto se essa stessa diventa astratta.
  5. Consentono ereditarietà multipla: Una classe Java può implementare più di un’interfaccia, consentendo così di ottenere l’ereditarietà multipla tramite interfacce.
  6. Utilizzate per definire comportamenti: Le interfacce vengono spesso utilizzate per definire comportamenti comuni che possono essere condivisi da diverse classi senza dover ereditare da una singola classe astratta.
  7. Un metodo può implemetare infinite interfacce

Quando una classe implementa un’interfaccia contenente un metodo di default, ha tre opzioni:

Sovrascrittura del Metodo di Default: La classe può scegliere di sovrascrivere il metodo di default con un'implementazione personalizzata. In questo caso, il metodo di default nella classe implementante avrà la precedenza su quello nella interfaccia.

Ereditare il Metodo di Default: La classe può scegliere di ereditare direttamente il metodo di default senza fornire una sua implementazione. In questo caso, il metodo di default nella interfaccia sarà utilizzato dalla classe.

Ridichiarare il Metodo: La classe può dichiarare un metodo con lo stesso nome del metodo di default dell'interfaccia, ma con una firma diversa (ad esempio, un metodo statico o un metodo non statico). Questo non costituirà una sovrascrittura e la classe non erediterà il metodo di default dell'interfaccia.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Quali sono le parole chiave per modificare il comportamento delle classi , metodi e variabili

A

abstract, static e final

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

descrivi abstract

A

In Java, la parola chiave abstract è usata per dichiarare classi e metodi che non possono essere istanziati direttamente e devono essere implementati o estesi da altre classi

Caratteristiche di una Classe Astratta:
Non può essere istanziata: Non è possibile creare un’istanza diretta di una classe astratta.
Può contenere metodi astratti: Metodi che non hanno un corpo e devono essere implementati dalle sottoclassi.
Può contenere metodi concreti: Metodi con un corpo che possono essere ereditati dalle sottoclassi.
Può contenere variabili di istanza e costruttori.
Inoltre la sottoclasse è obbligata a sovrascrivere i metodi astratti.
Un metodo astratto è un metodo dichiarato senza implementazione (senza corpo) all’interno di una classe astratta. Le sottoclassi concrete sono obbligate a fornire l’implementazione per questi metodi.

Caratteristiche di un Metodo Astratto:
Non ha un corpo: Il metodo è dichiarato senza un corpo ({}).
Deve essere implementato: Le sottoclassi concrete che estendono la classe astratta devono fornire l’implementazione di questo metodo.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Descrivi Static

A
  1. static: La parola chiave static viene utilizzata per dichiarare membri (variabili o metodi) di una classe come membri di classe anziché membri di istanza. Ciò significa che i membri statici appartengono alla classe stessa e non a specifiche istanze della classe. Possono essere accessibili direttamente attraverso il nome della classe, senza dover creare un’istanza della classe. Il concetto di static è molto particolare in quanto una variabile static è legata alla classe di appartenenza e prescinde dal concetto di oggetto

Esempio di variabile statica e metodo statico:
class Contatore {
static int count = 0; // Variabile statica (di classe)

static void increment() {  // Metodo statico (di classe)
    count++;
} }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

descrivi final

A
  1. final: La parola chiave final viene utilizzata per definire una costante, impedire l’ereditarietà di una classe o prevenire l’override di un metodo o la modifica di una variabile. Una variabile dichiarata con final non può essere modificata una volta assegnato un valore. Un metodo dichiarato con final non può essere sovrascritto nelle sottoclassi. Una classe dichiarata con final non può essere estesa.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Possibile avere una classe static?

A

Sì, in Java puoi avere una classe statica. Una classe statica è una classe interna dichiarata come static all’interno di un’altra classe. Una classe statica è associata alla classe esterna, e non alle istanze della classe esterna.
Le classi statiche possono essere utili quando hai una classe interna che non ha bisogno di accesso alle variabili di istanza della classe esterna e non vuoi creare un’istanza della classe esterna per utilizzare la classe interna.
Ecco un esempio di una classe statica:
java
public class ClasseEsterna {
// Variabile di istanza della classe esterna
private int variabileEsterna;

// Costruttore della classe esterna
public ClasseEsterna(int variabileEsterna) {
    this.variabileEsterna = variabileEsterna;
}

// Classe statica interna
static class ClasseStatica {
    // Metodo statico della classe statica
    static void metodoStatico() {
        System.out.println("Questo è un metodo statico della classe statica interna.");
    }
} } Puoi utilizzare la classe statica interna direttamente attraverso il nome della classe esterna, senza dover creare un'istanza della classe esterna: java public class Main {
public static void main(String[] args) {
    ClasseEsterna.ClasseStatica.metodoStatico();
} } Nell'esempio sopra, abbiamo una classe ClasseEsterna con una classe interna ClasseStatica, dichiarata come static. La classe interna ha un metodo statico metodoStatico() che possiamo richiamare direttamente usando il nome della classe esterna, come ClasseEsterna.ClasseStatica.metodoStatico(). Le classi statiche sono utili quando vuoi raggruppare logicamente classi correlate ma che non hanno una dipendenza dai dati dell'istanza della classe esterna.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

In java se provo a fare l’ override o l’ oreload dei metodi statici và in errore?

A
  1. Overload dei metodi statici: In Java, è possibile fare l’overload dei metodi statici. L’overload si verifica quando una classe ha più metodi con lo stesso nome ma con firme differenti (parametri diversi). Questi metodi possono essere metodi statici o di istanza. L’overload dei metodi statici è permesso e non causerà errori di compilazione.
  2. Override dei metodi statici: In Java, non è possibile fare l’override dei metodi statici. Quando si definisce un metodo statico in una classe, questo metodo appartiene alla classe stessa e non alle istanze della classe. Pur compilando non si sovrascrivono Poiché l’override coinvolge l’ereditarietà e il polimorfismo, che si applicano alle istanze delle classi, non è possibile sovrascrivere metodi statici. Tentare di farlo non causerà un errore di compilazione, ma il metodo definito nella classe figlia sarà considerato un metodo separato e non avrà alcun legame con il metodo statico nella classe genitore.
    In breve, puoi fare l’overload di metodi statici perché non coinvolge il polimorfismo, ma non puoi fare l’override di metodi statici in Java.
    In sintesi, l’overload dei metodi statici è possibile poiché riguarda solo la firma del metodo e non coinvolge il polimorfismo. L’override non è possibile perché l’implementazione dei metodi statici è associata alla classe stessa e non alle istanze, e quindi non esiste il contesto di ereditarietà necessario per il polimorfismo dell’override.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Possiamo avere classi Final?

A

Possiamo avere una classe final la quale non si può estendere ma la possiamo instanziare.

Il modificatore final impedisce l’ereditarietà, ma non influisce sulla capacità di creare oggetti della classe. Questa funzionalità è utile per creare classi che non dovrebbero essere estese per motivi di sicurezza, progettazione o integrità dei dati.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

quali sono i Modificatori di accesso?

A
  1. public: Un componente dichiarato con il modificatore public è accessibile da qualsiasi classe, sia all’interno dello stesso pacchetto che da pacchetti esterni.
  2. protected: Un componente dichiarato con il modificatore protected è accessibile dalla stessa classe, dalle sottoclassi e dalle altre classi nello stesso pacchetto.
  3. private: Un componente dichiarato con il modificatore private è accessibile solo dalla stessa classe. Non è accessibile dalle sottoclassi o da altre classi nello stesso pacchetto.
  4. Nessun modificatore (package-private/default): Se un componente non ha un modificatore di accesso specificato, si dice che ha un accesso “package-private” o “default”. Un componente con accesso package-private è accessibile solo dalle classi nello stesso pacchetto.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

cosa è Operatore di riferimento al metodo?

A

In Java, l’operatore :: è noto come “operatore di riferimento al metodo” o “operatore di riferimento ai costruttori”. Esso consente di fare riferimento a un metodo o a un costruttore esistente senza chiamarlo direttamente, ma piuttosto utilizzandolo come riferimento.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

a cosa servono le api stream di Java 8

A

Una Stream è una sequenza di elementi che supporta varie operazioni per la manipolazione dei dati. Può essere applicata a liste, set e mappe, oltre a altre fonti di dati, come array o input/output di file.
Si costruisce un collezione di dati che può essere una List o un array es:
* List<Double> valori = Arrays.asList(1.3,2.4,4.4);
Ottenuta la collection si trasforma in stream come sorgente con .stream()
* valori.stream();
adesso abbiamo le operazioni intermedie che possono essere tantissimi tra i più comuni
* .map (trasforma i dati)
* .filter (Li filtra)
* .sorted (li ordina)
Per terminare abbiamo le operazioni terminali le quali eseguono le operazioni intermedie e le assegnano ad una nuova lista le operazioni terminali sono:
* collect (esegue ed assegna)
* forEach (esegue e basta)</Double>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Il polimorfismo

A

Capacità di un oggetto di apparire in più forme
Esempio: Se abbiamo una classe Animale e una classe Cane che estende Animale, possiamo trattare un oggetto di tipo Cane come un oggetto di tipo Animale. Ad esempio:
Animale animale = new Cane();
Possiamo assegnare ad un oggetto Animale un oggetto di tipo cane.
Altro esempio è quello dell overload

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

descrivi l’ incapsulamento

A

E’ una tecnica che ci consente di incapsulare (proteggere) metodi e attributi di un oggetto.E di esporre solo quello che necessario.
Possiamo farlo attraverso i modificatori di accesso public private e protected fornendo dei metodi specifici per utilizzare i dati (es: bean get e set)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

cosa è una classe?

A

Rappresenta un modello per la la creazione di oggetti.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Passaggio dei parametri in Java

A

In Java, il passaggio dei parametri avviene sempre per valore,

19
Q

Le collection in Java

A

List,Set,Map,Queue,Deque,Iterator

20
Q

Collegarsi al db con i driver JDBC

A
  1. Carico driver Jdbc
  2. Inizializzo le tre costanti con le variabili dbUrl,username,psw
  3. Utilizzo le tre classi (Connection,Statement,Resulset)
  4. Connection conn = DriverManager.getConnection(url,user,psw)(uso Driver Manager)
  5. Statement sts = conn.createStatement(); (metodo: getStatement())
  6. Resulset rs = sts.ExecuteQuery(query); (Dividi la parola “ResultSet” in sillabe: “Re-sult-set”. Associa “Re” a qualcosa di reale o concreto, “sult” a “risultati”, e “set” a un insieme o un gruppo. Questo crea un’associazione mnemonica che ti aiuterà a ricordare il termine.)
21
Q

le eccezioni in java

A

Checked Exceptions (Eccezioni Verificate):
* Sono eccezioni che il compilatore verifica durante la compilazione. Devono essere gestite con un blocco try-catch o dichiarate con la clausola throws nel metodo. Tipicamente rappresentano condizioni che il programma non può prevedere ma che possono essere gestite razionalmente.
* Esempi:
o IOException
o SQLException
o FileNotFoundException

Unchecked Exceptions (Eccezioni Non Verificate):
* Sono eccezioni che non sono verificate dal compilatore. Derivano da RuntimeException e possono verificarsi durante l’esecuzione del programma. Tipicamente rappresentano errori di programmazione, come problemi logici o violazioni delle precondizioni.
* Esempi:
o NullPointerException
o ArrayIndexOutOfBoundsException
o ArithmeticException

int[] numbers = {1, 2, 3};
int number = numbers[3];
// This will throw ArrayIndexOutOfBoundsException

22
Q

Cosa è una Lambda?

A

In sostanza, una lambda expression è una funzione anonima che può essere utilizzata per implementare un’interfaccia funzionale.
Miglior Leggibilità:
Facilità di mantenimento
Programmazione funzionale

23
Q

Cosa è la programmazione funzionale?

A

La programmazione funzionale è un modo di pensare al codice che si basa su funzioni pure, immutabilità e composizione. Questo stile di programmazione può rendere il codice più leggibile, facile da testare e mantenere, e sicuro per l’uso in ambienti concorrenti. Una caratteristica della programmazione funzionale sono gli oggetti immutabili. Una volta definito il valore di un oggetto immutabile, questo non può più essere modificato

Java ha introdotto funzionalità di programmazione funzionale a partire dalla versione 8 con l’introduzione delle espressioni lambda e delle interfacce funzionali.

24
Q

Qual è la differenza tra un flusso parallelo e un flusso sequenziale in Java 8?

A

Un flusso parallelo consente di elaborare gli elementi contemporaneamente utilizzando più thread, mentre un flusso sequenziale elabora gli elementi uno per uno in un singolo thread. Per creare un flusso parallelo, puoi chiamare il metodo parallel() su un flusso.

25
Q

Qual è la differenza tra uno stream e una raccolta in Java 8?

A

Uno stream è una sequenza di elementi che possono essere elaborati in parallelo o in sequenza, mentre una raccolta è una struttura dati che memorizza un gruppo di elementi. Inoltre, i flussi forniscono un modo semplice per lavorare con le raccolte.

26
Q

Qual è un metodo predefinito in Java 8?

A

Un metodo predefinito è un metodo con la parola chiave ‘default’definita in un’interfaccia e dotato di un’implementazione predefinita. Se necessario, può essere sovrascritto da una classe di implementazione.

27
Q

Qual è la sintassi per un’espressione lambda in Java 8?

A

La sintassi per un’espressione lambda in Java 8 è:
(lista parametri) -> espressione
(lista parametri) -> {statements}

28
Q

Qual è la differenza tra un’espressione lambda e una classe interna anonima in Java 8?

A

In Java, una classe anonima è una classe senza nome che viene definita e istanziata tutto nello stesso momento Un’espressione lambda è un modo conciso per esprimere una funzione, mentre una classe interna anonima è un modo per creare una classe senza darle un nome.
Ecco un esempio di utilizzo di una classe anonima in Java per implementare un’interfaccia:

public class AnonymousClassExample {
public static void main(String[] args) {
// Creiamo una classe interna anonima che implementa Runnable
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(“Esecuzione del thread tramite classe anonima.”);
}
};

Creiamo e avviamo un nuovo thread usando la classe anonima

    Thread thread = new Thread(runnable);
    thread.start();
} }
29
Q

Cos’è un riferimento al metodo in Java 8?

A

Un riferimento al metodo è un modo abbreviato per scrivere un’espressione lambda che chiama un metodo. I riferimenti ai metodi possono essere utilizzati per semplificare il codice e migliorare la leggibilità eliminando la necessità di un’espressione lambda separata. Ad esempio, invece di utilizzare “x -> Math.sqrt(x)”, possiamo utilizzare “Math::sqrt” come riferimento al metodo.

30
Q

Quali sono le interfacce funzionali predefinite in Java 8?

A

Alcune interfacce funzionali predefinite comuni in Java 8
Queste interfacce funzionali possono essere utilizzate come obiettivi per le espressioni lambda e i riferimenti a metodi.

Le principali sono:
Function<T, R>
Consumer<T>
Supplier<R>
Predicate<T>
31
Q

Cos’è l’annotazione @FunctionalInterface in Java 8?

A

L’annotazione @FunctionalInterface in Java 8 viene utilizzata per indicare che un’interfaccia è un’interfaccia funzionale.

32
Q

Qual è l’uso del metodo distinct() nei flussi Java 8?

A

Il metodo distinct() in Java appartiene all’interfaccia Stream del pacchetto java.util.stream
Il metodo distinct() nei flussi Java 8 viene utilizzato per rimuovere elementi duplicati da un flusso

// Una lista di numeri interi con duplicati
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5, 6, 6);</Integer>

// Usa il metodo distinct() per ottenere numeri unici
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
// Stampa i numeri unici
System.out.println("Numeri unici: " + distinctNumbers);</Integer>

Numeri unici: [1, 2, 3, 4, 5, 6]

33
Q

Qual è l’uso del metodo findFirst() nei flussi Java 8?

A

In Java 8, il metodo findFirst() fa parte dell’interfaccia Stream nel pacchetto java.util.stream.
Il metodo findFirst() negli stream Java 8 viene utilizzato per restituire il primo elemento in un flusso che soddisfa una condizione specificata.
ATTENZIONE! Viene assegnato ad un oggetto Optional !! per leggerlo si usa il get().
List<String> persone = new ArrayList<>();
//Esercizio find first ...
persone.add("Mario");
persone.add("Giovanni");
persone.add("Teresa");</String>

	Optional<String> res = persone.stream()
									.findFirst();
	
	System.out.println(res.get());
	
	output-> Mario
34
Q

Perché lo scopo del metodo forEach() è stato aggiunto all’interfaccia Iterable in Java 8?

A

In Java 8, il metodo forEach() fa parte dell’interfaccia Stream nel pacchetto java.util.stream.
Il metodo forEach() è stato aggiunto all’interfaccia Iterable in Java 8 per fornire un modo semplice e conciso di scorrere le raccolte. Il metodo forEach() consente agli sviluppatori di scrivere codice più leggibile ed espressivo.

List<String> itter = new ArrayList<String>();
itter.add("cane");
itter.add("casa");
itter.add("cielo");
itter.add("palla");
itter.forEach(str-> System.out.println(str))

stampa:
casa
cane
cielo
palla

35
Q

Descrivi l’API LocalDate and LocalTime

A

Le classi LocalDate e LocalTime appartengono al package java.time in Java. Questo package è stato introdotto in Java 8 per fornire un modo più affidabile e flessibile di gestire date e orari. La nuova API consente agli sviluppatori di gestire date e orari in modo più semplice.
sono:

* LocalDate 
* LocalTime
* LocalDateTime  
* ZonedDateTime

LocalDate ld = LocalDate.now();	
System.out.println(ld);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");		
		LocalDateTime currentDateTime = LocalDateTime.now();
        String myDate = currentDateTime.format(formatter);
		System.out.println(myDate);
36
Q

Perché il pacchetto java.util.function è importante in Java 8?

A

Il pacchetto java.util.Function è importante in Java 8 perché offre un tocco di programmazione funzionale come un insieme di interfacce funzionali che possono essere utilizzate con le espressioni lambda. Il pacchetto java.util.function consente agli sviluppatori di scrivere codice più espressivo e conciso.

37
Q

Perché il metodo peek() è stato aggiunto all’API Stream in Java 8?

A

Il metodo peek() è stato aggiunto all’API Stream in Java 8 per consentire agli sviluppatori di eseguire il debug e comprendere il proprio codice più facilmente.

38
Q

Perché la classe Opzional<String> valore= optional.of(x) è stata introdotta in Java 8?</String>

A

La classe Optional<T> in Java 8, parte del pacchetto java.util
La classe Opzional è stata introdotta in Java 8 per fornire un modo di gestire i valori null in modo più conciso ed espressivo. La classe Opzional consente agli sviluppatori di scrivere codice più robusto e privo di bug</T>

39
Q

descrivi il metodo takeWhile()

A

Il metodo takeWhile() è stato introdotto in Java 9 come parte dell’interfaccia Stream
Il metodo takeWhile() è stato aggiunto all’interfaccia Stream in Java 8 per fornire un modo di selezionare elementi da uno stream fino a quando non viene soddisfatta una determinata condizione.
Attenzione! appena non trova la condizione esce

List<Integer> valori = Arrays.asList(1,2,3,4,5,6,7,8);
		
List<Integer> newValori = valori.stream()
.takeWhile(x->x<5)
.collect(Collectors.toList());
		
System.out.println(newValori);
40
Q

Cosa è IntStream.range ? a che cosa serve?

A

IntStream è una interfaccia di Stream appartiene al pacchetto : Java.util.Stream e viene utilizzato per ciclare i numeri sequenzialmente es se volessi stampare tutti i numeri da 0 a 10 scrivo IntStream.range(0,10).forEach(System.out::println); in abbinamento di intStream viene utilizzato un altro utile metodo di IntStream() ed è
mapToObj() il quale converte un oggetto in un altro:
nell esempio che segue viene convertita uno Stream di int in String vedi l’ esempio.
IntStream intStream = IntStream.range(1, 5);
Stream<String> stringStream = intStream.mapToObj(Integer::toString);
stringStream.forEach(System.out::println); // Output: "1", "2", "3", "4"</String>

41
Q

Per quanto riguarda le API.Stream di Java che differenza cè tra collection() e forEach()?

A

Collect viene utilizzato per raccogliere i risultati e generare una nuova collection
collection(Collectors.toList())
mentre forEach esegue una operazione su ogni singolo elemento ad esempio lo stampa
forEach(System.out::println);

42
Q

Quali sono le interfacce funzionali predefinite?

A

*Function<T, R>: accetta un argomento di tipo T e restituisce un risultato di tipo R.
*BiFunction<T, U, R>: accetta due argomenti di tipo T e U e restituisce un risultato di tipo R.
*Predicate<T>: accetta un argomento di tipo T e restituisce un valore booleano.
*Consumer<T>: accetta un argomento di tipo T e non restituisce nulla esegue e basta.
*Supplier<T>: non accetta argomenti e restituisce un valore di tipo T.</T></T></T>

43
Q

Interfaccia Comparator

A

In Java, Comparator è un’interfaccia funzionale che permette di definire un ordine personalizzato per gli oggetti di una collezione. Questo è particolarmente utile quando si utilizzano le API Stream per manipolare e ordinare dati complessi
List<Person> people = ...; // lista di persone
List<Person> sortedPeople = people.stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
quindi si utilizza in abbinamento a sort.
Per riepilogare se dobbiamo ordinare degli ogetti anche con un ordine personalizzato si usa sorted con l' interfaccia Comparator.</Person></Person>

44
Q

Cosa è OptionalInt ?

A

In pratica è una classe che ci consente di non sollevare una eccezione in caso di valore null. Per la dichiarazione di una variabile OptionalInt ed assegnazione procedere come di seguito:
OptionalInt optionalWithValue = OptionalInt.of(42); // Contiene il valore 42