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

  1. Cette interface- là a été définie pour avoir une seule méthode,

    This interface is defined to have only one method,

  2. avec une seule signature possible, avec un seul type de retour,

    with only one possible signature and one return type,

  3. avec une seule sorte d'argument.

    and one kind of argument.

  4. 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,

  5. ben on est capable de se rendre compte automatiquement que la seule chose qui peut

    when we look at this declaration here,

  6. 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

  7. 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)'.

  8. 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,

  9. interface fonctionnelle comme ça,

    we tell Java it can be used just like an anonymous function in JavaScript.

  10. 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,

  11. fonction anonyme en JavaScript.

    but with much less overhead.

  12. Donc, on peut instancier une classe anonyme

    Thus, we can write far less code

  13. qui implémente cette interface- là

    to create an anonymous class implementing this interface,

  14. avec beaucoup moins d'overhead,

    with far less redundancy,

  15. avec beaucoup moins de choses à taper avant d'y arriver.

    and far less typing before getting there.

  16. Ça nous permet de simplifier l'écriture des classes anonymes,

    This allows us to simplify writing anonymous classes,

  17. ça nous permet de rendre ça un petit peu plus lisible.

    and makes the code slightly more readable.

  18. Si on essayait encore d'écrire le code du début.

    If we tried rewriting the original code again,

  19. 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.

  20. 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,

  21. f. Selon math.

    of type Math.

  22. random plus petit que 0.5, on va soit aller mettre cette fonction anonyme- là,

    If Math.random() is less than 0.5,

  23. ce genre de fonction anonyme- là,

    we’ll place this anonymous function here,

  24. sinon on va plutôt mettre celle- là.

    otherwise we’ll place that one instead.

  25. Donc encore une fois, ces trucs- là ici,

    So, these constructs here are, in practice,

  26. concrètement ce que c'est, c'est que c'est des instances de classes qui sont

    instances of classes declared on-the-fly,

  27. déclarées sur le coup, qui contiennent une seule méthode.

    each containing only one method.

  28. Mais en utilisant cette syntaxe- là, ça a un peu plus l'air de ce

    But using this syntax, it looks

  29. qu'on essaie de faire.

    more like the function we’re trying to implement.

  30. Dans le fond, ici on a nos arguments,

    Essentially, here we have our parameters,

  31. flèche, le corps de la fonction.

    the arrow, and the function body.

  32. Ç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,

  33. 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.

  34. Ok, petite question pour vous.

    Okay, here’s a quick question for you.

  35. On a enlevé le type dans cette nouvelle déclaration,

    We’ve removed the type in this new declaration,

  36. donc dans cette nouvelle façon de déclarer des

    that is, when declaring anonymous classes this way,

  37. classes anonymes.

    using this new approach.

  38. On a enlevé le type du paramètre ici.

    Here, we’ve also removed the parameter’s type.

  39. 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?

  40. Dans le fond, est- ce qu'on pourrait assigner à f une

    Essentially, could we assign ‘f’ an instance of ‘Function’,

  41. instance de Function qui correspond à cette fonction- là ici,

    one that corresponds exactly to this function here,

  42. qui correspond à une fonction qui prend en paramètre un nom qui est une variable de

    namely, a function accepting a parameter named ‘nom’,

  43. type quelconque?

    whose type can be anything?

  44. puis qui exécute le code suivant,

    and then executes the following code,

  45. par exemple comme ça, ben

    for example, like this—

  46. non. Non, on peut pas faire ça.

    No. No, we cannot do that.

  47. On vient pas de changer la sémantique du langage Java.

    We haven’t changed Java’s language semantics at all.

  48. Je vous disais tantôt qu'on

    I mentioned earlier that

  49. parlait de sucre syntaxique ici.

    we’re talking about ‘syntactic sugar’ here.

  50. Dans le fond du sucre syntaxique, c'est quelque chose qui affecte

    Syntactic sugar, in essence, affects only

  51. la syntaxe du langage seulement.

    the language’s syntax.

  52. Comme je l'expliquais, ce qui se passe ici vraiment,

    As I explained, what actually happens is this:

  53. c'est que quand Java lit une affaire de même, quelque chose

    When Java reads something like this,

  54. comme ça, qui est assigné à une variable de type Function,

    for instance, an expression assigned to a variable of type ‘Function’,

  55. donc vraiment si on revient ici, on sait que f est de type Function,

    going back up, we know ‘f’ is of type ‘Function’,

  56. donc f doit absolument contenir quelque chose de type Function,

    so ‘f’ must absolutely contain something of type ‘Function’,

  57. doit absolument contenir une instance d'une classe compatible avec Function,

    i.e., an instance of a class compatible with ‘Function’,

  58. ben avec un petit peu d'analyse,

    and with just a little analysis,

  59. 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.

  60. 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.

  61. Puis Function ça contient une seule affaire, ça contient

    And Function contains just one thing:

  62. une fonction publique void Execute qui a

    a public void Execute method that takes

  63. 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,

  64. puis qui retourne exactement ce type de retour- là.

    and it returns exactly this return type.

  65. c'est qu'on vient pas de changer le sens de Java,

    This doesn’t mean we’ve changed Java’s fundamental meaning;

  66. on vient pas de rajouter la possibilité de faire n'importe quoi avec ça.

    nor have we added arbitrary capabilities to it.

  67. Dans le fond, quand on écrit quelque chose qui ressemble à ça,

    In fact, when we write something like this,

  68. 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

  69. automatiquement en ça.

    automatically into this.

  70. 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,

  71. mais avec moins de code.

    but with less code.

  72. Donc, avec moins d'overhead, avec moins de mots qui veulent un peu rien dire dans le

    That means reducing overhead and eliminating words

  73. contexte, pour que ce soit plus facile à lire ici.

    that carry little or no meaning in context—making it easier to read here.

  74. Quand vous écrivez ce code- là,

    When you write this code,

  75. se transforme automatiquement en ce grâce à l'annotation d'interface fonctionnelle.

    it automatically becomes this, thanks to the functional interface annotation.

  76. Ok, donc c'est tout pour ce chapitre- ci.

    Okay, that’s all for this chapter.

  77. Je vous invite à réécouter ça tranquillement,

    I invite you to listen to this calmly again,

  78. ça fait peut- être beaucoup de choses à

    as there may be quite a lot to absorb at once.

  79. assimiler d'un coup.

    (It’s quite a bit to take in.)

  80. 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,

  81. gardez ça dans un coin de votre tête puis

    just keep it tucked away in a corner of your mind,

  82. on va réutiliser ça dans le contexte des interfaces graphiques,

    because we’ll reuse it later in the context of graphical interfaces,

  83. 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.

  84. Donc voilà.

    That’s it.