Quote Originariamente inviata da newutente Visualizza il messaggio
Non riesco a capire questi pezzi di codice:
[...]
ma perchè si sceglie di implementare una interfaccia piuttosto che usare una classe ed estenderla?
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).

Quote Originariamente inviata da newutente Visualizza il messaggio
In questo caso non capisco cosa fa questo metodo. Dovrebbe restituire i film filtrati
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.

Quote Originariamente inviata da newutente Visualizza il messaggio
ma in base a che criterio?
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
                }
          } );
codice:
Film[] beiFilms =  videoteca.getFilmFiltrati(new FiltroFilm() {
                public boolean filtra(Film film) {
                return film.getMediaRecensioni() >3;  // <-------- QUESTO criterio
                }
          } );
Quote Originariamente inviata da newutente Visualizza il messaggio
Quello che però non capisco è cosa realmente accade in quelle righe di codice, in modo particolare il metodo filtra restituisce un booleano. E allora cosa fa quel codice? Passa un booleano al metodo getFilmFiltrati?
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.

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.