Lambda
Si 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 return
et 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.
if-else
;char
comme indicateur de fonctionnement ;switch-case
;- et tout ce qui vous vient à l'esprit.
- Seulement les lambdas, la tâche leur incombe.
inputStream
et 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'exigenceStringBuilder
. -
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.
-
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)
GO TO FULL VERSION