5. PROGRAMMATION FONCTIONNELLE ?
calcul en tant qu'évaluation
de fonctions mathématiques
Toujours les même paramètres
Toujours le même résultat
IMMUABLE
Une fonction ne doit jamais changer son environnement
7. N O N
AVONS-NOUS VRAIMENT
BESOIN DE LA
PROGRAMMATION
FONCTIONNELLE ?
• On peut faire l’équivalent en
programmation objet, c’est
le principe du
polymorphisme.
C E P E N DA N T
• La fonction à exécuter est
forcément dans une
méthode d’une classe.
13. D O U B L E
QUELLE EST LE TYPE DE RETOUR
DE CETTE FONCTION ? • Un développeur sait
déterminer le type de retour
en lisant le code.
• La JVM aussi.
N O N
• A la compilation il est
possible de déterminer le
retour d’une méthode.
EST-CE QUE CE BOUT DE CODE
COMPILE EN JAVA 1.4 ?
14. FUNCTION AS A VALUE
printSomething
public
INFERENCE DE TYPE : La JVM sait déterminer le
type à partir du traitement à exécuter entre les
accollades.
void
15. FUNCTION AS A VALUE
printSomething
public
void
Une seule exigence de la JVM pour comprendre
que la déclaration est un expression LAMBDA :
() -> { … } ;
16. FUNCTION AS A VALUE
printSomething
public
void
Une seule exigence de la JVM pour comprendre
que la déclaration est un expression LAMBDA :
() -> { … } ;
17. FUNCTION AS A VALUE
printSomething
public
void
() -> { … } ;
Simplification possible si le traitement s’écrit en une
ligne :
18. FUNCTION AS A VALUE
Autre simplification possible :
1 INSTRUCTION D’UNE LIGNE = PAS BESOIN DU
MOT CLE return
FOCUS SUR LE LAMBDA LANGAGE
REQUIS :
Vous êtes un développeur
Vous êtes familier à la programmation objet (et à la programmation JAVA)
Qui connait la programmation fonctionnelle ?
Qui en a déjà pratiquer ?
Aujourd’hui : UNIT 1 : Lambda expression
Vous me connaissez en tant que collègue, vous pouvez me suivre
JAVA 8 = REVOLUTION DANS LA VIE DU CODEUR !
QUELLES SONT LES AVANTAGES ?
1er AVANTAGE : Permet d’ajouter la programmation fonctionnelle
2ème : Elimination du Boilerplate code (voir plus tard) et des effets de bord
3ème : Concurrence et scalabilité
Y A PLEIN D’AUTRES AVANTAGES
Amélioration significatives des API Dates
Streaming
La concurrence
La scalabilité
Les effets de bords
NEXT : LA Prog fonctionnelle alors c’est quoi ?
WIKIPEDIA :
La programmation fonctionnelle est un paradigme de programmation de type déclaratif qui considère le calcul en tant qu'évaluation de fonctions mathématiques.
Une notion clé :
Pure fonction : 2 principes :
Toujours les même paramètres, toujours le même résultat : Si 2+2 != 4
Une fonction ne doit jamais changer son environnement : on ne change pas d’état de nos objets en programmation fonctionnelle
CONSEQUENCE :
Réduction des effets de bords
EN JAVA CA INTRODUIT LA FONCTIONNALITE SUIVANTE :
PARAMETRE = Un bout de code à exécuter, un instruction très précise.
Switch to Code :
public void printDemo(){ System.out.println("Enjoy your lunch");}public static void main(String... args){ GetStarted started = new GetStarted(); started.printDemo();}
Le souhait est de passer en paramètre quelque chose qui permet l’exécution : System.out.println("Enjoy your lunch");
Et pouvoir se dire que finalement printDemo peut faire ce qu’on veut
PROBLEME DE LA PROGRAMMATION ORIENTÉ OBJECT :
Tout est objet
Tout bloc de code
Pour répondre à l’objectif «PASSER UN TRAITEMENT (BEHAVIOR) EN PARAMETRE D’UNE METHODE »
NOUVEAU CONCEPT JDK 8 :
* Le code exécutable n’est «encapsulé» dans une classe ou objet plus une méthode d’une classe ou d’un objet mais juste du code
(ICI executableCode n’est pas typé, on revient sur ce point en deuxième partie)
Décrire l’INLINE VALUE
Décrire FUNCTION AS A VALUE (connu aussi sous le nom de
- High order function,
)
La classe qui exécute le code est aussi connu sous le nom de
First-class citizen : Classe qui supporte toutes les operations décrites ailleurs
SLIDE SUIVANT : EXPLICATION AVANT EXEMPLE
Pour bien comprendre :
Ecrire du code lambda se fait au sein d’une exécution de code.
Déclarer une expression Lambda en attribut d’une classe est dénouée de sens :
Contre objectif initial
Mauvais développeur (il suffit d’avoir une méthode dans la classe à ce moment là).
Quand on y pense, depuis toujours elle sait le faire.
Pour exemple :
public void
return new Object();
Ca ne compile pas.
SLIDE SUIVANT => Inférence de type
ALORS EST-CE QUE D’APRES VOUS, AVONS-NOUS BESOIN DE PRECISER LE TYPE DE RETOUR POUR UNE EXPRESSION LAMBDA ?
L'inférence de types est un mécanisme qui permet à un compilateur ou un interpréteur de rechercher automatiquement les types associés à des expressions, sans qu'ils soient indiqués explicitement dans le code source
Pourquoi ?
Pensez aux autres cas d’utilisations des paranthèses et des accollades quand vous tentez de déclarer une variable en java :
Cast d’un objet
Initialisation d’un tableau
Pourquoi ?
Pensez aux autres cas d’utilisations des paranthèses et des accollades quand vous tentez de déclarer une variable en java :
Cast d’un objet
Initialisation d’un tableau
Le mot clé «return» n’est pas obligatoire pour les instructions d’une ligne
Le mot clé «return» ici est obligatoire
Lorsque l’expression fait plusieurs lignes, le développeur perd la visibilité de son code. La conclusion est que l’expression lambda doit être utilisée pour des expressions courtes.
Autres exemples :
Switch to exemple.
Conclusion :
LAMBDA EXPRESSION :
FUNCTION AS A VALUE : PLUS BESOIN DE CLASSE POUR EXECUTER DU CODE
INFERENCE DE TYPE : SMART JVM, détermination du type de retour et des paramètre en input
A montrer :
- L’interface HelloWorld Java 7
Insister sur le fait que :
@FunctionalInterface (ça ne fait absolument rien, confort pour le développeur)
Créer la méthode :
public class HelloWorld { public void myMethod(HelloWorldInterface myFucntion){ myFucntion.printSomething(); }public static void main(String[] args){ HelloWorldInterface executableCode = () -> { System.out.println("Hello"); }; HelloWorld hello = new HelloWorld(); hello.myMethod(executableCode); hello.myMethod(() -> System.out.println("world"));}}
ETAPE DE PRESENTATION :
Créer la classe HelloMathInterface avec une seule méthode
Créer la classe HelloMath avec la méthode main (ci-dessous)
=> Exécuter
Update HelloMathInterface en ajoutant la méthode sum de double
Exécuter et expliquer l’erreur
Ajouter le mot clé default
Autre exemple :
Créer la classe HelloMathInterface :
@FunctionalInterfacepublic interface HelloMathInterface { int sum(Integer a, Integer b);}
Créer la classe HelloMath :
package tuto.lunchnlearn;public class HelloMath { public static void main(String[] args){ HelloMathInterface math = new HelloMathInterface() { @Override public int sum(Integer a, Integer b) { return a * b; } }; System.out.println(math.sum(10,5)); }}