You are on page 1of 8
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 (095 Esercizio 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.

You might also like