B2 · 第1集 · 5:11

Java中的函数式编程

本集介绍Java中的函数式编程概念,包括将函数作为值传递、匿名类和函数式接口的应用。

来源:Nicolas Hurtubise / classe.iro.umontreal.ca · 许可:CC BY-SA 4.0

字幕

  1. bonjour tout le monde bienvenue dans cette première tentative de faire un cours à

    大家好,欢迎来到我们首次尝试的远程课程!

  2. distance aujourd'hui on va parler d'un sujet qui est pas très très gros

    今天我们要讲一个内容不多

  3. Mais qui va être pas mal important pour la suite.

    但对后续学习却相当重要。

  4. Dans le fond, on va parler de notions de programmation fonctionnelle en Java,

    实际上,我们将介绍 Java 中的函数式编程概念,

  5. ce qui va beaucoup nous servir au niveau des interfaces graphiques.

    这些概念在图形用户界面开发中会非常有用。

  6. Donc quand je parle de programmation fonctionnelle, je

    当我提到函数式编程时,我指的是

  7. parle de choses comme en JavaScript.

    类似 JavaScript 中的那些特性。

  8. En JavaScript, on a que les

    在 JavaScript 中,语言里的函数

  9. fonctions dans le langage sont des objets comme les autres.

    和其他对象一样,本身也是对象。

  10. Dans le fond, une fonction comme direBonjour, on définit ça de cette façon- là.

    例如,我们这样定义一个名为 sayHello 的函数:

  11. On peut définir une fonction comme étant la fonction du paramètre nom qui va aller

    我们声明一个以参数 name 为输入的函数,

  12. afficher bonjour nom sur la console.

    它会在控制台输出“Hello, name”。

  13. Dans le fond, on déclare une fonction comme ça,

    本质上,我们像这样声明一个函数,

  14. puis on l'assigne à une variable, puis à partir de là,

    然后把它赋值给一个变量;之后,

  15. on peut faire pas mal ce qu'on veut avec cette variable.

    我们就能对这个变量做很多操作。

  16. Autrement dit, on peut par exemple se déclarer deux fonctions comme ça.

    换句话说,我们可以像这样定义两个函数:

  17. dire bonjour, dire bye bye,

    sayHello 和 sayByeBye,

  18. puis rien qui nous empêche mettons d'exécuter ce petit bout de code là ici,

    接着,我们完全可以运行下面这段代码——

  19. où on va carrément assigner le contenu d'une des variables dans l'autre variable.

    把其中一个变量的内容直接赋给另一个变量。

  20. Autrement dit, la fonction qu'il y a dans dire bye bye va se

    也就是说,sayByeBye 中的函数

  21. retrouver dans la variable fct, va

    将被放入变量 fct 中,

  22. se retrouver copiée dans la variable fct.

    也就是完整复制到 fct 变量里。

  23. Puis mettons qu'on exécute ce petit bout de code- là,

    再假设我们运行这段代码:

  24. ben selon si ma variable aléatoire est plus petite que 0.5, autrement dit,

    如果我的随机数小于 0.5,也就是说,

  25. on a une chance sur deux que ce code- là s'exécute.

    这段代码有百分之五十的概率被执行。

  26. Une chance sur deux que ce code- là s'exécute.

    这段代码执行的概率是二分之一。

  27. Fait qu'à la fin ici,

    所以,最终在这里,

  28. quand on arrive à exécuter cette ligne- là,

    当我们执行到这一行时,

  29. ben le fait d'appeler fct de tel paramètre,

    调用函数fct并传入某个参数,

  30. on sait pas si c'est cette fonction- là en haut ou cette fonction- là ici qui va

    我们无法确定到底会调用上面这个函数,

  31. être appelée. Dans le fond, la fonction va être définie selon qu'est- ce qui s'est

    还是这里这个函数。本质上,函数的具体定义取决于此处发生了什么。

  32. passé ici. puis puis puis puis donc c'est ça dans le fond les objets en javascript

    因此,JavaScript中的对象本质上就是——

  33. sont vraiment définis comme étant des objets comme les autres des valeurs comme les

    和其他普通值一样,

  34. autres qu'on peut passer n'importe où n'importe quand

    可以随时、任意地传递。

  35. Un autre exemple de ce qui serait peut- être plus pratique que le précédent.

    另一个例子可能比前面那个更实用。

  36. serait celui- là ici.

    就是这个。

  37. On a une fonction ici qui sert à déterminer si un nombre est pair.

    这里有一个函数,用于判断一个数是否为偶数。

  38. Donc vraiment la fonction prend un paramètre x, puis

    它接收一个参数x,

  39. fait rien d'autre que retourner si x modulo 2 est égal à 0.

    唯一的作用就是返回x对2取模是否等于0。

  40. On en a une autre qui sert à déterminer si un nombre est positif,

    我们还有另一个函数,用于判断一个数是否为正数,

  41. donc plus grand ou égal à 0.

    即是否大于或等于0。

  42. On a un tableau ici, puis on peut dans le fond aller utiliser la fonction filter qui

    这里有一个数组,我们可以使用数组自带的filter方法,

  43. est définie sur tous les tableaux

    该方法在所有数组上都有定义,

  44. pour aller filtrer les éléments selon cette fonction- là.

    来根据这个函数筛选元素。

  45. Dans le fond, n'importe quel élément de ce tableau- là

    本质上,这个数组中的任意元素,

  46. qui retourne vrai pour cette condition- là.

    只要满足这个条件并返回true,

  47. va être gardé, puis tous les autres vont être discartés.

    就会被保留,其余的则会被舍弃。

  48. Dans le fond, c'est une fonction qui va appliquer ça sur chacun des éléments,

    本质上,这是一个对每个元素依次应用该条件的函数,

  49. puis créer un tableau en fonction de ça.

    然后据此生成一个新数组。

  50. Donc, cette fonctionnalité- là dans les langages est particulièrement pratique dans

    因此,这种功能在编程中特别实用,

  51. le contexte de programmation événementielle.

    尤其是在事件驱动编程的场景下。

  52. La programmation événementielle,

    事件驱动编程,

  53. c'est un paradigme de programmation qui va focusser sur les événements qui peuvent

    是一种以程序运行期间可能发生的事件为焦点的编程范式,

  54. se produire pendant l'exécution d'un programme.

    这些事件在程序执行过程中随时可能出现。

  55. Dans le fond, ça s'oppose à la programmation séquentielle,

    本质上,它与顺序编程相对,

  56. ce que vous êtes habitués de faire jusqu'à maintenant.

    而你们此前一直采用的正是这种编程方式。

  57. La programmation séquentielle,

    顺序编程指的是,

  58. c'est quand vous programmez dans le but que tout s'exécute à peu près dans un ordre

    你编写代码时预设所有操作基本按既定顺序执行,

  59. prédéfini. Dans la programmation événementielle,

    而在事件驱动编程中,

  60. on va plutôt focusser sur qu'est- ce qui pourrait se produire comme événement,

    我们更关注可能发生哪些事件,

  61. puis qu'est- ce qu'on fait selon quel événement se produit.

    以及针对不同事件的发生,应采取什么相应操作。

  62. Un exemple de ça, ça serait sur une page web.

    一个典型例子是网页开发。

  63. Un utilisateur sur une page web peut cliquer sur n'importe quel bouton n'importe

    网页上的用户可以随时点击任意按钮,

  64. quand. On n'a pas une séquence d'événements prédéterminée,

    事件的发生并没有预先设定的固定序列,

  65. on a vraiment juste un tas pont de boutons sur lesquels on peut cliquer,

    页面上只是分布着大量可点击的按钮,

  66. puis ça va être à l'utilisateur de décider qu'est- ce qu'il fait.

    具体如何操作,完全由用户决定。

  67. La programmation événementielle repose donc sur définir des actions à prendre en

    因此,事件驱动编程的核心在于:

  68. réaction à ce que les utilisateurs vont faire.

    针对用户可能进行的操作,预先定义相应的响应动作。

  69. Mettons qu'on se fait une page web

    假设我们制作一个网页,

  70. qui répond à deux, trois actions,

    该网页需响应两三种用户操作,

  71. on pourrait par exemple dire que quand on clique quelque part sur la page,

    例如,我们可以设定:当用户点击网页任意位置时,

  72. ben ça affiche un pop- up, ou

    就弹出一个提示框;

  73. quand on appuie sur la touche espace,

    或者,当用户按下空格键时,

  74. ça affiche bonjour dans la console, par exemple.

    就在控制台中输出‘你好’。

  75. Le langage JavaScript a vraiment été conçu spécifiquement pour ce genre de code

    JavaScript 语言正是专为这类应用而设计的,

  76. utilisation- là.

    即用于编写事件驱动型代码。

  77. ça paraît dans justement dans cette fonctionnalité là,

    这一点恰恰体现在该功能上,

  78. ça paraît dans le fait que les fonctions soient des valeurs

    即函数本身也是值,

  79. comme les autres.

    和其他值一样。

  80. Mettons qu'on se définit une fonction ici qui va afficher un pop up à l'écran.

    假设我们在此定义一个函数,用于在屏幕上显示弹窗。

  81. On peut directement passer

    我们可以直接传入

  82. cette valeur- là, donc la valeur contenue dans la variable popup,

    这个值——也就是变量 popup 中存储的值,

  83. à une fonction qui va se charger d'enregistrer une paire de"

    给另一个函数,该函数负责记录一条“

  84. selon tel événement, exécute telle fonction".

    当发生某事件时,执行某函数”的规则。

  85. Dans le fond, ici ce que ça dit, c'est

    本质上,这里表达的意思是:

  86. quand on a un événement de type clic, il

    当发生点击类事件时,

  87. faut exécuter la fonction popup.

    就执行 popup 函数。

  88. Remarquez vraiment qu'ici on parle de la fonction,

    请注意,此处我们说的是函数本身,

  89. ici on n'exécute pas la fonction popup, on fait vraiment

    并未调用 popup 函数,而是仅仅

  90. juste donner une référence à ce qu'il y a dans cette variable- là.

    提供对该变量所存内容的一个引用。