Maison  >  Article  >  Java  >  Exemples de programmation fonctionnelle en Java8

Exemples de programmation fonctionnelle en Java8

黄舟
黄舟original
2017-08-09 14:03:282010parcourir

Programmation fonctionnelle, ce mot est composé de deux noms, fonction et programmation. Je n’ai pas besoin d’expliquer le mot programmation, tout le monde le fait. En fait, la fonction n'est pas inconnue lorsqu'elle est séparée du mot.Alors, quelle est la combinaison des deux ?L'article suivant vous présente principalement les informations pertinentes sur la programmation fonctionnelle Java8.

Préface

Dans un article précédent, nous avons rapidement appris Lambda et Stream, dans ce chapitre, nous passons en revue et comprenons les expressions fonctionnelles, les idées de programmation. On évoque sans cesse le terme fonctionnel, fait-il référence à lambda ? Si oui, quels avantages pouvez-vous tirer de l'adoption de la programmation fonctionnelle ?

Pensée fonctionnelle

Programmation impérative

Généralement, nous avons deux façons de penser à la mise en œuvre d'un système. L'une se concentre sur la façon de le mettre en œuvre, comme la cuisson. Habituellement, vous suivez la méthode de cuisson que vous connaissez : d'abord laver les légumes, puis les couper. , Faites chauffer l'huile, servez, et puis... Cela ressemble à une série de commandes. Nous appelons ce style de programmation « comment faire » la programmation impérative. Ses caractéristiques sont très similaires à celles de la chaîne de montage d'une usine et du traitement des instructions d'un ordinateur, qui sont toutes deux sérialisées et impératives.


CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...

Programmation déclarative

Il existe une autre façon de vous demander quoi faire si nous utilisons des expressions lambda et fonctionnelles pour résoudre les problèmes ci-dessus. Cela devrait ressembler à ceci :


public class CookingDemo {
 public void doTask(String material, Consumer<String> consumer) {
  consumer.accept(material);
 }
 public static void main(String[] args) {
  CookingDemo cookingDemo = new CookingDemo();
  cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material));
  cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片"));
  cookingDemo.doTask("食用油", material -> System.out.println(material + "烧热"));
  cookingDemo.doTask("", material -> System.out.println("炒菜"));
 }
}

Ici, nous laissons les détails d'implémentation de la cuisine à la bibliothèque de fonctions. Son plus grand avantage est que vous le lisez comme un énoncé de problème, en utilisant cette méthode, nous pouvons rapidement comprendre sa fonction. Lorsque vous ajoutez d'autres étapes dans le processus de cuisson, cela devient très simple. Il vous suffit d'appeler la méthode doTask pour transmettre les matériaux pour le traitement, par exemple, avant que l'huile de cuisson ne soit chauffée. , j'ai besoin de casser un œuf


cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打碎搅拌均匀"));

au lieu d'écrire une méthode pour manipuler l'œuf.

Qu'est-ce que la programmation fonctionnelle

La réponse la plus simple à la question "Qu'est-ce que la programmation fonctionnelle" est "C'est une manière de programmer en utilisant fonctions". La compréhension de chacun est différente, mais l'essentiel est le suivant : lorsque vous réfléchissez à des problèmes, utilisez des valeurs et des fonctions immuables. Les fonctions traitent une valeur et la mappent à une autre valeur.

Les différentes communautés linguistiques ont souvent une admiration exclusive pour les caractéristiques de leurs langues respectives. Il est trop tôt pour parler de la façon dont les programmeurs Java définissent la programmation fonctionnelle, mais cela n'a aucune importance ! Nous nous soucions d’écrire du bon code, et non du code conforme à un style de programmation fonctionnel.

Imaginons concevoir une fonction qui entre un type de chaîne et des paramètres de type booléen et génère un paramètre entier.


int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}

Cet exemple a une entrée et une sortie en même temps, chaque appel peut également mettre à jour la valeur des variables externes. Nous appelons une telle fonction un effet secondaire. fonction.

Dans le contexte de la programmation fonctionnelle, une « fonction » correspond à une fonction mathématique : elle accepte zéro ou plusieurs arguments, produit un ou plusieurs résultats, et n'a aucun effet secondaire. Vous pouvez le considérer comme une boîte noire, qui prend des entrées et produit des sorties, comme la fonction suivante. La distinction entre les fonctions vues dans le langage est très importante (on ne peut pas imaginer que des fonctions mathématiques telles que log ou sin aient des effets secondaires). En particulier, lorsqu'une fonction mathématique est appelée avec les mêmes paramètres, le résultat qu'elle renvoie doit être le même. Ici, nous ne considérerons pas les méthodes comme Random.nextInt pour l'instant,


Effets secondaires des fonctions
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}

Quand on parle de "fonctionnel", on Ce qu'il dit en réalité, c'est "comme une fonction mathématique - pas d'effets secondaires". De là découlent des problèmes subtils de programmation. Voulons-nous dire que chaque fonction ne peut être construite qu'à l'aide de fonctions et d'idées mathématiques comme si-alors-sinon ? Ou permettons-nous également que certaines opérations non fonctionnelles soient effectuées à l'intérieur des fonctions, tant que les résultats de ces opérations ne sont pas exposés à d'autres parties du système ? En d’autres termes, si le programme a certains effets secondaires, mais que ces effets secondaires ne seront pas perçus par les autres appelants, pouvons-nous supposer que cet effet secondaire n’existe pas ? L'appelant n'a pas besoin de connaître ces effets secondaires ni de s'en soucier, car cela n'a absolument aucun effet sur lui. Quand on souhaite définir la différence entre les deux, on appelle la première programmation purement fonctionnelle et la seconde programmation fonctionnelle.

En programmation réelle, il nous est difficile d'utiliser le langage Java pour compléter un programme de manière purement fonctionnelle, car de nombreux anciens codes, y compris les fonctions de bibliothèque standard, ont des effets secondaires (l'appel de Scanner.nextLine a des effets secondaires, cela Lisez une ligne d'un fichier, généralement les résultats de deux appels sont complètement différents). Vous souhaitez écrire une implémentation presque purement fonctionnelle de votre système et vous devez vous assurer que votre code n'a aucun effet secondaire. Supposons qu'une telle fonction ou méthode n'a aucun effet secondaire lors de la saisie du corps de la méthode pour exécution, la valeur d'un champ sera augmentée de un, et avant de quitter le corps de la méthode, la valeur du champ sera diminuée de un. Pour un programme monothread, cette méthode n'a aucun effet secondaire et peut être considérée comme une implémentation fonctionnelle.

Notre ligne directrice pour la construction d'un style fonctionnel est que les fonctions ou méthodes appelées « style fonctionnel » ne peuvent modifier que les variables locales. De plus, les objets auxquels elles font référence doivent être définitifs. Tous les champs de type référence pointent vers des objets immuables.

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn