-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstream-filter-map-reduce-java8.html
221 lines (184 loc) · 12.6 KB
/
stream-filter-map-reduce-java8.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>Stream, map, filter et reduce en java 8 </title>
<!-- Bootstrap Core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="css/clean-blog.min.css" rel="stylesheet">
<style>
blockquote {
font-style: normal;
font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
border-radius: 4px;
}
</style>
<!-- Custom Fonts -->
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href='http://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header page-scroll">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">Accueil</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<li>
<a href="contact.html">Contact</a>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container -->
</nav>
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header class="intro-header" style="background-image: url('img/post-bg.jpg')">
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<div class="post-heading">
<h1>Stream, map, filter et reduce en java 8 </h1>
<span class="meta"> 10 Septembre 2017</span>
</div>
</div>
</div>
</div>
</header>
<!-- Post Content -->
<article>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<h3>Stream, map, filter et reduce en java 8 </h3>
<p>Après avoir échappé pendant quelques années à la programmation fonctionnelle qui revient sur le devant de la seine, Java à finalement adopté les quelques principes de la programmation fonctionnelle au printemps 2014. Java 8 comprend un support pour les expressions lambda et offre une puissante API Streams qui vous permet de travailler avec des séquences d'éléments tels que les listes et les tableaux avec une nouvelle manière de faire.</p>
<p>Dans ce tuto, nous allons essayer de montrer comment créer des flux (steams), afin de les transformer par la suite en utilisant map , filter et reduce qui sont des méthodes proposées dans la version java 8.</p>
<h3>Stream </h3>
<p>Un stream n'est qu'une séquence d'éléments. Bien qu'il existe de nombreuses approches pour la création d’un stream, pour l'instant, nous nous concentrerons uniquement sur la génération de stream des listes et des tableaux.</p>
<p>Dans Java 8, chaque classe qui implémente cette interface possède une méthode qui vous permet de convertir ses instances en objets. Par conséquent, il est trivialement facile de convertir une liste en stream. Voici un exemple qui convertit l'un des objets en un stream</p>
<blockquote>
// Création de la liste<br>
List list = new ArrayList <>();<br>
list.add(1);<br>
list.add(2);<br>
list.add(3);<br>
// Conversion de la liste en stream<br>
Stream <> stream = list.stream();
</blockquote>
<p> Nous pouvons aussi appliquer un stream sur les tableaux
<blockquote>
// Création du tableau<br>
Integer[ ] array = {1, 5, 8};<br>
// Conversion du tableau en stream<br>
Stream <> stream = Arrays.stream(array);
</blockquote>
<br>
<h3 >La méthode map</h3>
<p>Une fois que vous obtenez un objet stream, vous pouvez utiliser une variété de méthodes pour le transformer en un autre stream. La première méthode que nous allons examiner est la méthode map. cette expression lambda est utilisée pour changer chaque élément individuel dans le stream. Sa valeur de retour est un nouvel objet stream contenant les éléments modifiés.</p>
<p>Pour vous donner un exemple réaliste, permettez-moi de vous montrer comment vous pouvez utiliser map pour convertir tous les éléments d'un ensemble de chaînes en majuscules.</p>
<p>Ensuite, vous pouvez appelez la méthode map, en passant une expression lambda, qui peut convertir une chaîne en majuscule, en tant que seul argument:</p>
<blockquote>
String[ ] array = new String[ ]{"toto", "titi", "tata", "tete"};<br>
Stream <String> stream = Arrays.stream(array);<br>
Stream <String> newStream = stream.map(s -> s.toUpperCase());
</blockquote>
<p>Puis à la fin vous obtenez un nouveau tableau un ensemble de chaînes, toutes en majuscules</p>
<blockquote>
String[ ] newArray = newStream.toArray(String[ ]::new);
</blockquote>
<h3 >La méthode filter</h3>
<p>Dans la section précédente, vous avez vu que la map traite chaque élément dans un objet stream. Vous pourriez ne pas toujours vouloir cela. Parfois, vous voudrez peut-être travailler avec seulement un sous-ensemble des éléments. Pour cela, vous pouvez utiliser la méthode filter.</p>
<p>Tout comme la map, filter attend une expression lambda comme argument. Cependant, l'expression lambda qui lui est transmise doit toujours renvoyer un boolean qui détermine si l'élément traité doit ou non appartenir à l' objet Stream résultant .</p>
<p>Par exemple, si vous disposez d'un ensemble de chaînes et que vous souhaitez créer un sous-ensemble qui contient uniquement les chaînes dont la longueur est supérieure à quatre caractères, vous devez écrire le code suivant:</p>
<blockquote>
Arrays.stream(array)
.filter(s -> s.length() > 4)
.toArray(String[]::new);
</blockquote>
<p>Le code ci-dessus est beaucoup plus concis que le code que nous avons écrit dans l'exemple précédent parce que j'ai enchaîné toutes les méthodes Stream. La plupart des développeurs préfèrent écrire le code fonctionnel de cette manière, car, habituellement, il n'est pas nécessaire de stocker des références sur des objets stream intermédiaires.</p>
<h3 >La méthode reduce</h3>
<p>Une opération reduce est celle qui vous permet de calculer un résultat en utilisant tous les éléments présents dans un strem. Les opérations de réduction sont également appelées opérations de terminal car elles sont toujours présentes à la fin d'une chaîne de la méthode stream. Nous utilisons déjà une méthode de réduction dans nos exemples précédents: la toArray. C'est une opération de terminal car elle convertit un stream objet en un tableau.</p>
<p>Java 8 comprend plusieurs méthodes de réduction, telles que sum, averageet count qui permettent d'effectuer des opérations arithmétiques sur des stream objets et d'obtenir des nombres en tant que résultats. Par exemple, si vous souhaitez trouver la somme d'un ensemble d'entiers, vous pouvez utiliser le code suivant:</p>
<blockquote>
int array[ ] = { 1, 5, 8 };<br>
int sum = Arrays.stream(array).sum();
</blockquote>
<p>Si vous souhaitez effectuer des opérations de réduction plus complexes, vous devez utiliser la méthode reduce. Contrairement aux méthodes map et filter, le reduce s'attend à deux arguments: un élément d'identité et une expression lambda. Vous pouvez considérer l'élément d'identité comme un élément qui ne modifie pas le résultat de l'opération de réduction. Par exemple, si vous essayez de trouver le produit de tous les éléments dans un stream de nombres, l'élément d'identité serait le numéro 1.</p>
<p>L'expression lambda que vous passez à la méthode reduce doit être capable de gérer deux entrées: un résultat partiel de l'opération de réduction et l'élément actuel du stream. Si vous vous demandez quel résultat partiel, c'est le résultat obtenu après le traitement de tous les éléments du stream précédant l'élément actuel.</p>
<p>Voici un exemple d'extrait de code qui utilise la méthode reduce pour concaténer tous les éléments dans un ensemble d'objets string:</p>
<blockquote>
String[ ] array = { "le", "java", "c'est", "fun" };<br>
String result = Arrays.stream(array)<br>
.reduce("", (a,b) -> a + b);
</blockquote>
<br>
<p>Pour en savoir plus sur l'API Streams et les autres méthodes qu'elle offre, vous pouvez consulter sa documentation .</p>
</div>
</div>
</div>
</article>
<hr>
<!-- Footer -->
<footer>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<ul class="list-inline text-center">
<li>
<a href="https://twitter.com/ghiles_J">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-twitter fa-stack-1x fa-inverse"></i>
</span>
</a>
</li>
<li>
<a href="https://github.com/aaitsalem/">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-github fa-stack-1x fa-inverse"></i>
</span>
</a>
</li>
</ul>
<p class="copyright text-muted">Copyright © le webeur 2017</p>
</div>
</div>
</div>
</footer>
<!-- jQuery -->
<script src="js/jquery.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="js/bootstrap.min.js"></script>
<!-- Custom Theme JavaScript -->
<script src="js/clean-blog.min.js"></script>
</body>
</html>