Si consideri la seguente interfaccia Ten Int Array che rappresenta un array di interi che pud contenere al massimo 10
elementi interi. Un chiamante pud accedere agli elementi dell’array mediante il loro indice (metodo get () ), aggiungere
un elemento in ultima posizione (metodo add () ) ¢ rimuovere elemento in ultima posizione (metodo remove () ). Se
il chiamante prova ad aggiungere un elemento in un TenIntAxxay pieno, viene sospeso fino a quando un altro thread
rimuove un elemento.
public interface TenIntArray {
[ae
* Ritorna il valore contenuto in posizione pos, se presente,
+ altrimenti lancia una InvalidIndexException.
ov
public int get(int pos) throws Invalidindextxc
[ae
+ Rimuove 1/ultimo elemento dall’array.
* Se l’array e’ vuoto non fa nulla
public void remove ();
a
* Aggiunge val nella prima posizione libera dell’ array.
+ Se l’array e? pieno, blecca il chiamante fino a quando una
* posizione si libera
”
public void add(int val);Domanda b)
Si consideri la seguente classe Test che utilizza TenIntArray. Indicare per quali valori di k si pud garantire che tutti
i thread lanciati nel main () terminino.
public class Test implements Runnable {
private final TentntArray t;
private final int idj
public Test (TenIntarray t, int id) {
this.t
this.id
}
@override
public void run() (
if (id82!=0) {
t.add (id)
) else {
e.remove ()
)
»
public static void main(String[] args) (
final int k = 222;
final TenTntArray arr = new TenTntArraytmpl ();
for (int i= 1; 1 <= ky itt)
final Thread thread = new Thread(now Test (arr, id);
thread.start ();
1
}
)
Soluzione
Alcuni thread potrebbero non terminare per i>20. In questo caso, potrebbero essere eseguiti per primi tutti i thread con
indice id pari, che lasciano t yuoto, Successivamente 10 thread con id dispari potrebbero riempire t, bloccando ogni
successivo thread con id dispari che invoca t . add (id).Esercizio 4
‘Si considerio le seguenti classi Java, in cui viene omessa l'ovvia implementazione dei metodi osservatori getMembers ().,
getage (), getName)
public class Group {
public List getttenbere|) {
public int getage() { ... J]
}
Si risponda ai seguenti quesiti facendo uso esclusivamente di costrutti della programmazione funzionale.
Domanda a)
Si completi l'implementazione del seguente metodo per fare in modo che stampi I'etd media delle persone appartenenti al
gruppo. Se il gruppo & vuoto, il metodo non deve stampare nulla
public static void printaverage (Group group) (
1
Solurione
public static void printaverage (Group group) [
group.getMenbers () .strean()
mapToTnt (p -> p.getage())
raverage()
-ifpresent (System. out: :printin) ;
)
Domanda b)
‘Si complet 'implementazione del seguente metodo per fare in modo che ritorni una lista contenente { nomi di wue Te persone
‘maggiorenni presenti allinterno dei gruppi in groups:
public static List namesInGroups (List
return groups. stream ()
-flatMap(g -> ¢.qetMenbers () .stream())
sfilter (> > p.getage() > 18)
smap(p -> p.getWane()]
1s (Collectors. toList (1);
oup> groupe) (Esercizio 3
‘Si consideri la seguente classe di cui viene qui omessa l'ovvia implementazione-
public class student [
private ...;
public Student (String nane, int year, ...)
Public String name() {...)
public int yearorBirth() [...}
public String countryofairen() {
public String personaiCode(){...}
)
Sia data una List 9 che contiene una lista di studenti opportunamente inizializzat
Rispondere alle domande seguenti usando esclusivamente i costrutti della programmazione funzionale (senza quindi usare
while, if. else, forEach, eve.)
Domanda a)
Completare Vistruzione seguente per assegnare alla variabile youngForei gners i codiei persona degli studenti non italiani
nati dopo il 2000 presenti nella lista s.
Eist youn:
Soluzione
Eist«String> youngForeigners ~ s.stream()
-filter (student ~> !student .count ryOfBirth () equals ("Ttaly"))
iEliter (student -> student.yearoreieth() > 2000)
map (student -> student .personalcode ())
seollect (Collectors.toList (J);
Domanda b)
‘Memorizzare in una variabile naneO£¥oungest Chinese lo studente cinese piti giovane della lista 8. Successivamente,
solo se presente, stampare a schermo il suo nome (senza utilizzare il costrutto if. else di Java).
Soluzione
final Opticnal nameofYoungestChinese ~ s.otzean()
-filter (student -> student .countryofBirth () equals (*Caina™) )
treduce((studl, stud2) -> studl.yearorBirth() > stud2-yearorsirth() ? studl + stud?)
naneOfYoungest Chinese. i#Precent (student -> System. out .printLa (student.
280 (095Esercizio 4
si
rogrammazione furcionale.
wsiderino i seguenti metodi Java e se ne completino le parti omesse, uilizgando escusivamente i concett e i costrutt della
Domanda a)
1 metodo seguente prende come argomento una lista di nomi (di tipo St ring) (il parametro Seople) ¢ restituisce il nome
ddi maggiore lunghezza fra quelli imteramente in maiuscolo. Per esempio, se la lista include i nomi “Paolo”, "MARIO", "ISA",
‘Antonio”, il metodo restituisce "MARIO". Se non esiste alcun nome insteramente in maiuscolo, il metodo restiuisce la stringa
Si ricorda che la classe S|
ng ha il metodo Length () che restituisce la lunghezza della stringa,
public static String Longe:
return ....j
nUppercase|Listesteing> people) {
1
Suggerimento: per verificare se un nome @ interamente in maiuscolo si pud ad esempio usare il metodo toUpperCase ()
della classe String, che restituisce la conversione in majuscolo della strings this ~ un semplice confronto del risultato con
originale pud stabilire se I'originale era gia interamente in maiuscolo.
Soluzione
public static String longest TnOppercase (List people) {
return people. stream()
Filter(name -> name.equals(name.tolppercase {}))
reduce((nanel,name2) -> ramel.length|}>-nere2.length() ?namel : name2)
orBise(*n.a.");
Domanda b)
1 metodo seguente prende ancora come argomento una lista di nomi di tipo String (il parameto peop e), ma restituisce a
lista dei nomi che non sono interamente in maiuscolo, convertt in maiuscolo. Per esempio, se la lista include i nomi "Paolo",
“MARIO", “ISA”, "Antonio", i metodo resttuisce una lista composta da "PAOLO", "ANTONIO"
public static List intlppercase(List people) {
return ....5
)
Sotuzione
public statle List Intppercase(List people) {
return people.strean|)
sfilter (name -> !name.equals(name.touppercase {}))
‘map (name —> name. toUppezCaze (1)
collect (Collectors .tolist ()};Esercizio 4
Si considerino i seguenti metodi Java e se ne completino le parti omesse, wtlizzando escusivamente i conceit e icostrutti della
programmacione farcionale,
‘Domanda a)
‘Il metodo seguente prende come argomento una lista di persone (Person) ¢ restituisee una lista delle persone con pid di 60
Si ipotizzi che la classe Person abbia il metodo get Age () che restituisce I'et della persona.
public static List elder (List people) (
List elder = 6. 7
return elder;
Soluzione
public static Lisi older (hist-cPerson> people) (
List elder —
people.stream()
Filter |person -> person.getAge() > 50)
collect (Collectors ronist (0);
return elder;
‘Domanda b)
TI metodo seguente prende come argomento una lista di nomi e stampa il nome pid lungo, se la lista non ® vuota, altrimenti non
stampa nulla,
public static void longest (Lict names)
final optional names)
final Optional thelongest = friends. stream()
sreduce((nanel, nane2} ->
narel-length() ?= nane2.length() 7 namet : nane2);
thelongest.ifPresent (name —>
Syater.out. n(String. format ("The longest name: ts", nane)))+Esercizio 4
Si consider il seguente metodo statico Java, scrtto in stile imperative:
public static int deepMistery (final String name, final List names) (
ull) return 0;
for (String x + names) {
if (name. equals(x)) count=count +
else count——;
}
return count;
}
Domanda a)
Serivere lo stesso programma in stile funzionale, completando il codice sequente negllo spazio lasciato bianco:
public static int deepMistery (final String name, final List names) {
if (names==mull || name ==null) retura 0;
Soluzione
public static int deepMistery (final String name, final List names) {
ull || name ==null) retura 0;
return names. stream ()
map(x ~> ((x.equals(name)) ? 2: —1))
reduce (0, (subtot , elem) —> subtot + elem);
if (names:
}
+
Oppure
public static int deepMistery (final String name, final List names) {
if (names==mull || name ==null) return 0:
return names. stream ()
mapTolat(x —> ((x.equals(name)) 22: —1))
sum);Esercizio 3
Si consideri il metodo £indMyTntegers, non completamente definito, della seguente classe Exam:
public clase Exam {
public static List findtyrntegers(List abist, Predicate aPredicate) {
BifunctioncList, Predicate, List> onlyine;
onlyMine = (myListofint, myPredicate) -> (
h
return onlyMine.apply(aList, aPredicate];
public static void nain(String() s){
Predicatecrnteger> predicate = x —> x ¥ 2 == 0;
List startingbist = Arrays.asList(l, 7, 4, 6 & 9);
Listcinteger> finalist = findMyIntegers(startingList, predicate);
System.out print In (finalList);
>
‘i metodo applica il predicato aPreai cate, definito con I'interfaccia funzionale Predicate, al parame-
‘wo aList. restituendone, come una nuova lista tut e soli i valori che soddisfano il predicato stesso.
A tale scopo, ilcodice utiliza I'interfaccia funzionale Bi funct Son per definire una funzione che riceve come argomenti
una listae un Predicate di Integer, resttutendo una lista,
La definizione delle due interfacce funzionali viene ricordata di seguito:
@Funct ional interface
public interface BiFunction {
// Bpply this function to two arguments;
R apply (7 t, 0 ul;
}
@runctionalinterface
public interface Predicate {
J/ Evaluates this predicate on the given argument:
boolean test (T t);
}
‘Completare il codice del metodo usando preferibilmente un approccio funzionale. Indicare inolire il risultato dell esecu-
2ione del metodo main interno alla classe Exam,
‘Soluzione
Basta inserire al posto puntini la seguente riga
return myListOfInt.stream() . filter (myPredicate) collect (Collectors.tobist ())+
1 main stampa 4,6, 8.