B2 · Episode 4 · 4:59
Functional Interfaces in Java
This episode explains functional interfaces in Java—interfaces with a single abstract method—and demonstrates how lambda expressions simplify the creation of anonymous classes that implement them, improving code readability and reducing boilerplate.
Source:Nicolas Hurtubise / classe.iro.umontreal.ca · License:CC BY-SA 4.0
Transcript
Cette interface- là a été définie pour avoir une seule méthode,
This interface is defined to have only one method,
avec une seule signature possible, avec un seul type de retour,
with only one possible signature and one return type,
avec une seule sorte d'argument.
and one kind of argument.
fait qu'avec un petit peu d'analyse de code si on regarde cette déclaration là ici
This means that with just a little code analysis,
ben on est capable de se rendre compte automatiquement que la seule chose qui peut
when we look at this declaration here,
venir après la seule chose qui peut venir ici c'est un
we can automatically realize that the only thing that can appear here is
new function qui est déclarée anonymement avec un public void execute string arg
a new anonymous function declared as 'public void execute(String arg)'.
comme ceci. fait qu'à partir du moment où on déclare une interface comme étant une
So, once we declare an interface as a functional interface like this,
interface fonctionnelle comme ça,
we tell Java it can be used just like an anonymous function in JavaScript.
On dit à Java que c'est possible d'utiliser cette interface là comme si c'était une
That is, we can instantiate an anonymous class implementing this interface,
fonction anonyme en JavaScript.
but with much less overhead.
Donc, on peut instancier une classe anonyme
Thus, we can write far less code
qui implémente cette interface- là
to create an anonymous class implementing this interface,
avec beaucoup moins d'overhead,
with far less redundancy,
avec beaucoup moins de choses à taper avant d'y arriver.
and far less typing before getting there.
Ça nous permet de simplifier l'écriture des classes anonymes,
This allows us to simplify writing anonymous classes,
ça nous permet de rendre ça un petit peu plus lisible.
and makes the code slightly more readable.
Si on essayait encore d'écrire le code du début.
If we tried rewriting the original code again,
Avec cette nouvelle syntaxe- là, on arriverait à quelque chose qui a l'air de ça.
using this new syntax, we’d get something like this.
On arriverait encore à déclarer une variable pour contenir notre genre de fonction
We can still declare a variable f to hold this kind of function,
f. Selon math.
of type Math.
random plus petit que 0.5, on va soit aller mettre cette fonction anonyme- là,
If Math.random() is less than 0.5,
ce genre de fonction anonyme- là,
we’ll place this anonymous function here,
sinon on va plutôt mettre celle- là.
otherwise we’ll place that one instead.
Donc encore une fois, ces trucs- là ici,
So, these constructs here are, in practice,
concrètement ce que c'est, c'est que c'est des instances de classes qui sont
instances of classes declared on-the-fly,
déclarées sur le coup, qui contiennent une seule méthode.
each containing only one method.
Mais en utilisant cette syntaxe- là, ça a un peu plus l'air de ce
But using this syntax, it looks
qu'on essaie de faire.
more like the function we’re trying to implement.
Dans le fond, ici on a nos arguments,
Essentially, here we have our parameters,
flèche, le corps de la fonction.
the arrow, and the function body.
Ça a vraiment plus l'air d'être une fonction toute seule qui est déclarée comme ça,
This really looks more like a standalone function declared this way,
qu'on assigne à une variable qui peut contenir ce type de fonction- là.
which we assign to a variable capable of holding this kind of function.
Ok, petite question pour vous.
Okay, here’s a quick question for you.
On a enlevé le type dans cette nouvelle déclaration,
We’ve removed the type in this new declaration,
donc dans cette nouvelle façon de déclarer des
that is, when declaring anonymous classes this way,
classes anonymes.
using this new approach.
On a enlevé le type du paramètre ici.
Here, we’ve also removed the parameter’s type.
Donc, sachant ça, est- ce que la variable nom peut contenir n'importe quoi?
So, given that, can the variable ‘nom’ hold anything at all?
Dans le fond, est- ce qu'on pourrait assigner à f une
Essentially, could we assign ‘f’ an instance of ‘Function’,
instance de Function qui correspond à cette fonction- là ici,
one that corresponds exactly to this function here,
qui correspond à une fonction qui prend en paramètre un nom qui est une variable de
namely, a function accepting a parameter named ‘nom’,
type quelconque?
whose type can be anything?
puis qui exécute le code suivant,
and then executes the following code,
par exemple comme ça, ben
for example, like this—
non. Non, on peut pas faire ça.
No. No, we cannot do that.
On vient pas de changer la sémantique du langage Java.
We haven’t changed Java’s language semantics at all.
Je vous disais tantôt qu'on
I mentioned earlier that
parlait de sucre syntaxique ici.
we’re talking about ‘syntactic sugar’ here.
Dans le fond du sucre syntaxique, c'est quelque chose qui affecte
Syntactic sugar, in essence, affects only
la syntaxe du langage seulement.
the language’s syntax.
Comme je l'expliquais, ce qui se passe ici vraiment,
As I explained, what actually happens is this:
c'est que quand Java lit une affaire de même, quelque chose
When Java reads something like this,
comme ça, qui est assigné à une variable de type Function,
for instance, an expression assigned to a variable of type ‘Function’,
donc vraiment si on revient ici, on sait que f est de type Function,
going back up, we know ‘f’ is of type ‘Function’,
donc f doit absolument contenir quelque chose de type Function,
so ‘f’ must absolutely contain something of type ‘Function’,
doit absolument contenir une instance d'une classe compatible avec Function,
i.e., an instance of a class compatible with ‘Function’,
ben avec un petit peu d'analyse,
and with just a little analysis,
on est capable de se rendre compte que ce truc- là peut pas être n'importe quoi.
we can realize this construct simply cannot be anything at all.
Ce truc- là peut juste être une instance d'une classe anonyme de Function.
This thing is simply an anonymous instance of the Function class.
Puis Function ça contient une seule affaire, ça contient
And Function contains just one thing:
une fonction publique void Execute qui a
a public void Execute method that takes
exactement ce paramètre- là, donc il y a ce type de paramètre- là,
exactly this parameter—so its parameter type is exactly this one,
puis qui retourne exactement ce type de retour- là.
and it returns exactly this return type.
c'est qu'on vient pas de changer le sens de Java,
This doesn’t mean we’ve changed Java’s fundamental meaning;
on vient pas de rajouter la possibilité de faire n'importe quoi avec ça.
nor have we added arbitrary capabilities to it.
Dans le fond, quand on écrit quelque chose qui ressemble à ça,
In fact, when we write something like this,
il y a de l'analyse qui se fait automatiquement du côté de Java pour transformer ça
Java automatically analyzes it on the backend and transforms it
automatiquement en ça.
automatically into this.
Fait que vraiment, le but est d'écrire exactement la même chose que ça,
So the real goal is to write exactly the same logic as this,
mais avec moins de code.
but with less code.
Donc, avec moins d'overhead, avec moins de mots qui veulent un peu rien dire dans le
That means reducing overhead and eliminating words
contexte, pour que ce soit plus facile à lire ici.
that carry little or no meaning in context—making it easier to read here.
Quand vous écrivez ce code- là,
When you write this code,
se transforme automatiquement en ce grâce à l'annotation d'interface fonctionnelle.
it automatically becomes this, thanks to the functional interface annotation.
Ok, donc c'est tout pour ce chapitre- ci.
Okay, that’s all for this chapter.
Je vous invite à réécouter ça tranquillement,
I invite you to listen to this calmly again,
ça fait peut- être beaucoup de choses à
as there may be quite a lot to absorb at once.
assimiler d'un coup.
(It’s quite a bit to take in.)
Si jamais ça vous paraît pas tout de suite clair à quoi ça sert tout ça,
If it’s not immediately clear to you what all this is for,
gardez ça dans un coin de votre tête puis
just keep it tucked away in a corner of your mind,
on va réutiliser ça dans le contexte des interfaces graphiques,
because we’ll reuse it later in the context of graphical interfaces,
puis vous devriez voir assez rapidement qu'est- ce qu'on fait avec tout ça.
and then you’ll quickly see what we’re actually doing with all of this.
Donc voilà.
That’s it.