FiltroFilm è una normalissima interfaccia che definisce un "contratto" di filtro (per questo, è meglio che sia una interfaccia ... non una classe) del tipo "qualcuno ti passa un oggetto Film, digli se true o false". Poi si potrebbe discutere sul senso del boolean, cosa significano true e false. In linea di massima e sensatamente si può pensare: true = il film è ok (insomma, lo accetto).
Se noti, prima passa il Film (films[i]) a filtra che è implementato nell'oggetto passato al metodo getFilmFiltrati. Poi se filtra restituisce true, allora il Film lo mette in un elemento dell'array.
Insomma, qui è evidente che "true" significa che il Film è accettato, altrimenti viene scartato.
Questi, chiaramente differenti per ottenere liste differenti:
codice:Film[] filmDiFantascienza = videoteca.getFilmFiltrati(new FiltroFilm() { public boolean filtra(Film film) { return"Fantascienza".equals(film.getGenere()); // <-------- QUESTO criterio } } );getFilmFiltrati riceve un oggetto che "vede" solo come tipo FiltroFilm (la interfaccia). A getFilmFiltrati NON importa dove è implementata la interfaccia, se in una classe top-level, se in una inner-class "regular" oppure "anonymous" (anonima) o altro.codice:Film[] beiFilms = videoteca.getFilmFiltrati(new FiltroFilm() { public boolean filtra(Film film) { return film.getMediaRecensioni() >3; // <-------- QUESTO criterio } } );
A getFilmFiltrati interessa solo che l'oggetto è un FiltroFilm, quindi di sicuro ha quel metodo filtra. Quindi il metodo getFilmFiltrati passerà tutti i Film presenti, uno per volta, al metodo filtra, ovvero invoca filtra sull'oggetto FiltroFilm. filtra restituisce un boolean, in base a questo, getFilmFiltrati si comporta di conseguenza.![]()