JavaRush /Blog Java /Random-FR /Lambdas et streams, seulement de la pratique, pas de théo...

Lambdas et streams, seulement de la pratique, pas de théorie

Publié dans le groupe Random-FR
Salut tout le monde. A l'occasion du concours, j'ai décidé d'écrire ici non pas un article, mais une courte leçon. Il s'agira de lambdas et de streams en Java. Si vous les connaissez déjà et que vous les utilisez, passez directement à la fin de l'article, il y aura une petite sélection de tâches avec JavaRush sur lesquelles vous pourrez vous entraîner. Il faut Java 8 et supérieur, une formation de JR, il y aura peu de détails et beaucoup de choses incompréhensibles, une forte envie de comprendre. Commençons par le fait que je n'expliquerai pas l'histoire de l'apparition des lambdas et des streams, je ne la connais tout simplement pas moi-même. Je sais seulement qu'ils viennent du style de programmation fonctionnelle à notre style POO. Au cours de ma courte expérience d'apprentissage, j'ai simplement montré comment et quoi, certaines personnes ont du mal à comprendre l'idée, alors rappelez-vous simplement comment écrire, vous comprendrez plus tard.

Lambda

Lambdas et streams, seulement de la pratique, pas de théorie - 1Lambdas et streams, seulement de la pratique, pas de théorie - 2Si vous ne savez pas du tout ce que sont les lambdas, alors : Un lambda ressemble à ceci :
(a, b) -> a.compareTo(b)
(переменные) -> действие
C'est suffisant pour l'instant. Vous pouvez lire la théorie ici : lien un , lien deux , mais je pense que la pratique est beaucoup plus amusante. Je vous suggère de résoudre le problème suivant : Écrivez une calculatrice en utilisant la méthode 1. La méthode doit accepter 2 valeurs numériques et autre chose. Votre code ressemblera à ceci :
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Vous devez entrer 3 paramètres dans la signature de la méthode calculate, ajouter 1 commande returnet tester l'appel de cette méthode dans main. Que devrait pouvoir faire cette méthode ?
  • pli;
  • multiplier;
  • diviser;
  • soustraire;
  • calculer la racine ;
  • élever à un pouvoir;
  • élever à une puissance la somme des arguments divisée par le premier nombre + 117 ;
  • et toutes les autres opérations auxquelles vous pouvez penser.
Ce qu'il ne faut pas utiliser :
  • if-else;
  • charcomme indicateur de fonctionnement ;
  • switch-case;
  • et tout ce qui vous vient à l'esprit.
Ce que vous pouvez utiliser :
  • Seulement les lambdas, la tâche leur incombe.
- Quoi? Et c'est tout ? - Oui, c'est tout, car il faut littéralement ajouter 3 lignes, si j'en propose au moins une, le reste sera écrit automatiquement. Et si vous le souhaitez, vous pouvez rechercher des exemples sur Google et essayer de comprendre. Bien sûr, vous vous contrôlerez et si vous trichez, personne ne le saura, mais alors pourquoi ? Après avoir résolu un problème aussi simple, tous mes 1,5 étudiants ont acquis une compréhension approximative de ce que sont les lambdas et comment les utiliser. Cela sera très nécessaire pour le streaming. Si vous voulez vous vanter du résultat et savoir si vous l'avez bien fait, envoyez le code dans un message privé. Inutile de commenter, vous pouvez y ajouter des astuces intéressantes (mais de manière à ne pas rendre la tâche trop facile). Encore une fois, après avoir résolu cet exemple, vous devriez déjà avoir une compréhension approximative de la façon d'utiliser les lambdas.
Lambdas et streams, seulement de la pratique, pas de théorie - 3
Passons maintenant aux flux Java. Ce ne sont pas les flux auxquels vous, lecteur, avez peut-être pensé. Non, ce n'est pas le cas inputStreamet ce n'est pas le cas OutputStream. C'est différent, c'est plus intéressant. Les flux ont remplacé les cycles, pas complètement, mais quand même. On leur sert la devise « n’expliquez pas comment faire, expliquez quoi faire ». Un petit exemple de stream :
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Que se passe t-il ici? Ajoutons des commentaires :
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Comparez avec une boucle régulière :
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Quand vous lisez le code, tout semble effrayant, mais est-ce plus facile avec des commentaires ? C’est normal, je ne les ai pas compris pendant longtemps non plus. La clé de la compréhension est la pratique. Par conséquent, nous commençons à lire des articles tiers et à chercher des réponses à nos questions, vous pouvez également les poser ici dans les commentaires, je ne donnerai pas de réponse complète, mais je vous indiquerai la direction. Liste des tâches de JavaRush qui, à mon avis, sont idéales pour pratiquer le streaming :
  • 2208 - peut être résolu avec 1 flux et 1 retour, c'est-à-dire le corps de la méthode commencera par return, puis il y aura 1 flux entier. Oublions l'exigence StringBuilder.

  • 1908 - vous pouvez également le résoudre avec 1 flux et 1 retour. En commençant par la lecture du fichier. Je ne sais pas comment enregistrer dans un fichier via des flux (si cela est possible), pour l'instant nous le faisons manuellement. Ceux. Nous n'ouvrons que 2 flux (console et écriture dans un fichier). Nous lisons le fichier grâce à des méthodes qui nous renverront soit une feuille, soit un flux (google et javadoc).

  • 1907 - en théorie, il peut également être résolu en un seul flux. L'entrée du flux est le nom du fichier, la sortie est le nombre de mots du monde.

C'est tout. Si je peux, j’écrirai une autre histoire simple. À mon avis, lire quelque chose de cool sans avoir la possibilité de l'essayer est en quelque sorte ennuyeux ou quelque chose du genre. Et après la calculatrice et les 3 énigmes, je pense que vous vous entendez déjà bien avec les lambdas et les streams, alors découvrez toutes les possibilités si ce n'est pas déjà fait. MISE À JOUR :
  • 1016 - de manière légèrement pervertie, vous pouvez le résoudre en 1 flux et 1 retour ;

  • 1821 - très facile et en 1 ruisseau et 1 retour.

    Ces 2 tâches vous feront découvrir une autre méthode de streaming et un autre collecteur.

  • 1925 - vous pouvez obtenir une ligne avec des mots dans un flux, puis l'écrire dans un fichier (je ne sais pas s'il est possible d'écrire dans un fichier à partir d'un flux)

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION