Vous êtes sur la page 1sur 4

Master 2 BBSG POO, langage Java Henri Garreta et Laurent Tichit

6. Types paramtrs
1. Cration dune collection par slection dlments
2. Transformation des lments d'une collection
3. Rduction des lments d'une collection
AVERTISSEE!T. "es classes et interfaces lies au# collections$ su%issent & partir de
la 'ersion ( de )a'a une importante modification$ puis*uelles de'iennent
+ ,nri*ues -. Cela se manifeste$ notamment dans la documentation en li,ne$ par
une notation spciale . le si,ne <E> /comme + Element -0 & c1t du nom$ *ui
reprsente un type /une interface$ ou plus rarement une classe0 .
public interface Collection<E> {
...
}
A cause de la ,nricit$ si 'ous utilise2 des collections d'Object et non pas des
collections ,nri*ues a'ec )a'a( /et suprieur0$ 'ous ris*ue2 do%tenir des
a'ertissements concernant des oprations + incontr1les - ou + dan,ereuses - .
Note: MachinTruc.java uses unchecke or unsafe operations.
3our 'iter ces messa,es$ soit 'ous utilise2 les collections ,nri*ues$ soit /'ous
'ous contente2 de rester dans la pr4istoire0 il 'ous suffit de compiler 'otre fic4ier
source en indi*uant *uil rel5'e de )a'a 1.6 .
javac !source ".# <fichiers__compiler>
/la 'ersion 1.6 prc5de immdiatement la 'ersion (0. 7tilisateurs dEclipse$ pour
o%tenir le m8me rsultat 'ous de'e2 aller dans Project 9 Properties 9 Java Compiler$
coc4er la case Enable project specific settings et :ouer sur lindication du c4amp
Compiler compliance level.
3;7R<7;I = 3our des raisons de scurit$ la mac4ine 'irtuelle )a'a 1.6 /et les
prcdentes0 teste les t>pes des lments insrs dans les collections /et e#traits de
celles?ci0. Ces tests ont lieu & l'e#cution /on parle alors de tests d>nami*ues0 si on
utilise )a'a 1.6 /ou infrieur0 car & la compilation$ il est impossi%le de conna@tre le
t>pe des donnes A elles sont 'ues simplement comme des Object. Si on utilise les
'ersion ,nri*ues /)a'a (B0$ ces tests peu'ent /enfinC0 a'oir lieu & la compilation
/tests stati*ues0 car on dclare le t>pe des lments D9 meilleures performances C Si
on utilise les collections non?,nri*ues a'ec )a'a(B$ il faut donc le dclarer C
6.1. Cration dune collection par slection dlments
A ? En supposant *uune interface Critere$election a t ainsi dfinie
public interface Critere$election {
boolean ok%Object &'(
}
cri'e2 une classe Test$election a'ec une mt4ode de si,nature
static Collection<)nte*er> selection%Collection<)nte*er> source+
Critere$election critere'(
*ui ren'oie la collection forme des lments de source *ui satisfont le critere donn. Ecri'e2
une fonction ,ain *ui
cre une liste A un -rra./ist$ ou une /inke/ist$ etc. A portant les nom%res entiers
de F & 1FF /des o%:ets )nte*er0$
appelle la mt4ode selection pour en e#traire la liste des multiples de 3$
affic4e le rsultat o%tenu.
Gaites en sorte *ue selection ren'oie un o%:et de t>pe Collection<)nte*er> *ui soit en
fait un -rra./ist.
B ? aintenant$ on aimerait *ue notre mt4ode selection fonctionne pour des collections de
n'importe *uel t>pe$ plut1t *ue de tra'ailler uni*uement sur des )nte*er. ;n 'a donc paramtrer
la mt4ode /et la rendre ,nri*ue0 .
static <E> Collection<E> selection%Collection<E> source+
Critere$election<E> critere'(
E#plication . "e premier <E> indi*ue *ue notre mt4ode est paramtre a'ec un nou'eau t>pe
<E>$ les autres indi*uent *u'on retournera une collection contenant des lments du m8me t>pe *ue
la source$ et *ue le crit5re de slection porte sur ce m8me t>pe.
!ous allons donc rcrire Critere$election de la faHon sui'ante .
interface Critere$election<E> {
public boolean ok%E e'(
}
3uis$ on peut dfinir une classe EstMultiple0e1 de la faHon sui'ante .
class EtreMultiple0e1 i,ple,ents Critere$election<)nte*er> {
public boolean ok%)nte*er n' {
return n 2 1 33 4(
}
}
Rcri'e2 donc la mt4ode selection. Votre main ne de'rait pas 8tre modifi. 3our tester la
,nricit de 'otre mt4ode selection$ dans 'otre ,ain$ cre2 une collection de 0ouble$ et
un crit5re Est$uperieura5) *ui tra'aille sur des 0ouble et retourne les lments de la
collection suprieurs & I. 7tilise2 la classe java.lan*.Math$ %ien 'idemment.
C ? Nu,ber est une classe a%straite$ m5re de tous les t>pes numri*ues. odifie2 la classe
Est$uperieura5) pour *u'elle tra'aille maintenant sur des Nu,ber$ afin de pou'oir lui passer
des listes d')nte*er ou de 0ouble. Vous de'rie2 o%tenir une seule erreur & la compilation.
Celle?ci est due au fait *u'on impose /dans le protot>pe de selection0 *ue le critre porte
e#actement sur le m8me t>pe *ue les lments de source. ;r$ dsormais$ notre crit5re tra'aille sur
des Nu,ber$ *ui sont une gnralisation de Double. Jans le protot>pe de la mt4ode
selection$ remplace2 donc .
Critere$election<E> critere par Critere$election<6 super E> critere
E#plication . <6 super E> se traduit par + n'importe *uelle ,nralisation /super?classe0 de E -.
E#emple . on poss5de deu# crit5res . + tous les vertbrs *ui sont 'enimeu# - et + tous les animaux
*ui p5sent plus de 1FF, -. ;n peut$ & :uste titre$ les appli*uer & une collection de batraciens /car un
batracien est un vertbr et un animal0. Il faut donc prciser que le critre peut porter sur un
type plus gnral que les lments de la collection. Jans le cas *ui nous occupe$ on ne pourrait
pas faire l'in'erse /utiliser un crit5re portant un t>pe plus spcialis0$ par e#emple slectionner les
lments multiples de 3 d'une collection contenant des Nu,ber /car ceu#?ci peu'ent 8tre des
0ouble0 et *ue le fait d'8tre multiple de 3 n'a de sens *ue sur des )nte*er.
Il e#iste aussi <6 e&tens E> *ui se traduit par + n'importe *uelle spcialisation /sous?classe0
de E -. ;n 'a s'en ser'ir dans le proc4ain e#ercice.
6.2. Transformation des lments d'une collection
A ? En supposant *ue 'ous dispose2 dune interface telle *ue .
public interface Transfor,ation {
Nu,ber transfo%Nu,ber &'(
}
cri'e2 une classe TestTransfor,ation a'ec une mt4ode de si,nature
static Collection<Nu,ber> transfor,ation%Collection<Nu,ber> source+
Transfor,ation trans'(
*ui ren'oie la collection forme des lments *ui sont le rsultat de l'application de transfo sur
c4a*ue lment de source. Ecri'e2 une fonction ,ain *ui
cre une liste A un -rra./ist$ ou une /inke/ist$ etc. A portant des nom%res entiers
et dou%les compris par e#emple entre de F & (F /des o%:ets )nte*er et 0ouble0$
appelle la mt4ode transfor,ation pour crer une liste de racines carres de c4acun
des lments de source.
affic4e le rsultat o%tenu.
Gaites en sorte *ue transfor,ation ren'oie un o%:et de t>pe Collection *ui soit en fait un
-rra./ist.
B ? Je la m8me mani5re *ue dans l'e#ercice prcdent$ 'ous aure2 & modifier l'interface
Transfor,ation pour la rendre paramtra%le.
Cre2 aussi deu# classes 7acine et 8loor *ui implmentent cette interface et tra'aillent sur des
Nu,ber. "es mt4odes transfo retournent respecti'ement un 0ouble et un )nte*er.
Jans le main$ 'ous crere2 une liste d')nte*er *ue 'ous transformere2 ,rKce & 7acine et une
liste de 0ouble *ue 'ous transformere2 ,rKce & 8loor.
Votre mt4ode transfor,ation de'rait a'oir le protot>pe sui'ant .
static <E> Collection<E> transfor,ation%Collection<6 e&tens E> source+
Transfor,ation<E> trans'
E#pli*ue2 pour*uoi il est ncessaire de spcifier *ue source puisse contenir des lments d'une
sous?classe de ceu# utiliss par Transfor,ation =
C ? 3our finir$ on peut ima,iner *u'& partir d'une liste de $trin*$ on dsire o%tenir une liste
contenant les lon,ueurs de ces $trin*. ;r$ les t>pes $trin* et )nte*er n'ont aucune relation
de parent.
"e protot>pe ultime de notre mt4ode transfor,ation de'rait 8tre finalement le sui'ant .
static <E+ 8> Collection<8> transfor,ation%Collection<6 e&tens E> source+
Transfor,ation<E+ 6 e&tens 8> trans'
Cre2 la classe /en /*ui calcule la lon,ueur d'une $trin*0 et modifie2 le reste de 'otre code /les
classes 8loor et 7acine$ etc.0 pour *ue l'ensem%le de 'otre code fonctionne a'ec cette derni5re
mouture de transfor,ation.
E#pli*ue2 pour*uoi + 6 e&tens 8 - est prfra%le & + 8 - =
6.3. Rduction des lments d'une collection
"es 2 e#ercices prcdents implmentent les fonctions classi*ues map(function, iterable) et
filter(function, iterable). ;n retrou'e ces fonctions dans p>t4on2 par e#emple. Il e#iste une
troisi5me fonction similaire reuce(function,iterable) *ui appli*ue cumulati'ement une fonction
/*ui doit 8tre %inaire0 & c4a*ue couple d'lments de la liste et retourne un rsultat du m8me t>pe
*ue ceu# des lments de la collection.
En utilisant l'interface sui'ante
public interface 7euction<E> {
E transfo%E a+ E b'(
}
cri'e2 un ensem%le de classes et mt4odes cal*ues sur les deu# e#ercices prcdents en
appli*uant une fonction so,,e & une collection d'entiers et la fonction concatenation & une
liste de Strin,.
3our*uoi une collection pour la somme et une liste pour la concatnation = 3arce *ue l'addition est
commutati'e alors *ue la concatnation ne l'est pas.