3
3
import java .util .List ;
4
4
import java .util .NoSuchElementException ;
5
5
import java .util .Optional ;
6
- import java .util .OptionalInt ;
7
6
import java .util .stream .Collectors ;
8
7
9
8
/*
@@ -21,21 +20,20 @@ public static void main(String[] args) {
21
20
OptionalDemo demo = new OptionalDemo ();
22
21
// Un-comment one at a time like in YouTube tutorial
23
22
24
- demo .theProblem ();
23
+ // demo.theProblem();
25
24
// demo.theSolutionInTherory();
26
25
// demo.HowToCreateOptionals();
27
- // demo.HowToRetrieveValuesFromOptionalSimpleImperative();
28
- //
29
26
// demo.getValuesOutOfOptionalsUnguarded();
27
+ // demo.HowToRetrieveValuesFromOptionalSimpleImperative();
30
28
// demo.optionalsFunctionalMap();
29
+
31
30
// demo.getOrElseAlternative();
32
31
// demo.getOrElseGetAlternative();
33
32
// demo.getOptionalOrDefaultOptional();
34
33
// demo.getOrElseThrowAlternative();
35
34
//
36
- // demo.listOfOptionalInt_boxingOverhead();
37
- // demo.listOfOptionalIntSpecialization();
38
- // demo.listOfOptionalConflictFlatMap();
35
+ // demo.listOfOptionals();
36
+ // demo.listOfOptionalStreamFlatMap();
39
37
}
40
38
41
39
void theProblem () {
@@ -46,7 +44,7 @@ void theProblem() {
46
44
int requestingFlightLevel = 36000 ;
47
45
48
46
if (actualFlightLevel != requestingFlightLevel ) {
49
- Conflict conflict = flight .probeForConfictLegacyClassic ();
47
+ Conflict conflict = flight .probeForConfictPossiblyReturningNull ();
50
48
sendToAllDistributedApplications (conflict );
51
49
}
52
50
}
@@ -58,7 +56,7 @@ void theSolutionInTherory() {
58
56
flight .setFlightLevel (actualFlightLevel ); //current Flight Level (FL)
59
57
60
58
if (actualFlightLevel != requestingFlightLevel ) {
61
- Optional <Conflict > conflict = flight .probeForOptionalConfict ();
59
+ Optional <Conflict > conflict = flight .probeForConflictReturningOptional ();
62
60
//commented out to show that cant pass null by accident anymore
63
61
//sendToAllDistributedApplications(conflict);
64
62
}
@@ -88,13 +86,13 @@ void HowToCreateOptionals() {
88
86
//DO NOT EVER DO THIS, defeats the entire purpose!!!
89
87
//Optional.of(null);
90
88
}
91
-
89
+
92
90
/*
93
91
Bad because using Optional.get() without checking if first value present.
94
92
Might be ok, might not. your taking a chance
95
93
*/
96
94
void getValuesOutOfOptionalsUnguarded () {
97
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict (); //random conflict returned
95
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional (); //random conflict returned
98
96
//try/catch from demo sake
99
97
try {
100
98
Conflict conflict = optionalConflict .get ();
@@ -104,29 +102,28 @@ void getValuesOutOfOptionalsUnguarded() {
104
102
System .out .println ("Un-guarded get()...got a NoSuchElementException exception!" );
105
103
}
106
104
}
107
-
108
105
/*
109
106
Without use of Optional, written in the classical if/else == null way.
110
107
versus entry level Optonal, imperative way
111
108
*/
112
109
void HowToRetrieveValuesFromOptionalSimpleImperative () {
113
110
//simple, non-Optional way
114
- Conflict conflict = flight .probeForConfictLegacyClassic ();
111
+ Conflict conflict = flight .probeForConfictPossiblyReturningNull ();
115
112
if (conflict != null ) {
116
113
System .out .println ("Conflict detected: " + conflict .getConflictId ());
117
114
} else {
118
115
System .out .println ("No Conflict" );
119
116
}
120
117
121
118
//versus Optional - imperative way
122
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
119
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
123
120
if (optionalConflict .isPresent ()) {
124
121
System .out .println ("Conflict id: " + optionalConflict .get ());
125
122
} else {
126
123
System .out .println ("missing Conflict id" );
127
124
}
128
125
}
129
-
126
+
130
127
/* Now using a function style of programming. The map method
131
128
extracts the value of the Optional (if present) as per the
132
129
mapper function (lambda/method reference in the case below)and return
@@ -140,19 +137,21 @@ mapper function (lambda/method reference in the case below)and return
140
137
Note: if you don't care for "Else" then just use the ifPresent(Consumer<? super T> action)
141
138
*/
142
139
void optionalsFunctionalMap () {
143
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
140
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
144
141
optionalConflict
145
142
.map (Conflict ::getConflictId )
146
143
.ifPresentOrElse (System .out ::println ,
147
144
() -> System .out .println ("No Conflicts detected" ));
148
145
}
146
+
147
+ //END OF PART 1
149
148
150
149
/*
151
150
.orElse() ALWAYS gets invoked, even if Optional is present.
152
151
Possible performance overhead ..maybe, depends on what your creating.
153
152
*/
154
153
Conflict getOrElseAlternative () {
155
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
154
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
156
155
Conflict conflict = optionalConflict .orElse (getDefaultConflict ());
157
156
158
157
System .out .println ("orElse conflict id: " + conflict .getConflictId ());
@@ -164,7 +163,7 @@ Conflict getOrElseAlternative() {
164
163
Great for returning a default value
165
164
*/
166
165
Conflict getOrElseGetAlternative () {
167
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
166
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
168
167
Conflict conflict = optionalConflict .orElseGet (() -> getDefaultConflict ());
169
168
170
169
System .out .println ("orElseGet conflict id: " + conflict .getConflictId ());
@@ -178,7 +177,7 @@ Conflict getOrElseGetAlternative() {
178
177
Great for returning a default Optional
179
178
*/
180
179
Optional <Conflict > getOptionalOrDefaultOptional () {
181
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();//random Conflict
180
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();//random Conflict
182
181
return optionalConflict .or (() -> Optional .of (getDefaultConflict ()));
183
182
}
184
183
@@ -189,45 +188,26 @@ Optional<Conflict> getOptionalOrDefaultOptional() {
189
188
NoSuchElementException if Optional is empty - since Java 10
190
189
*/
191
190
Conflict getOrElseThrowAlternative () {
192
- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();//random Conflict
191
+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();//random Conflict
193
192
return optionalConflict .orElseThrow (NoConflictException ::new ); //might throw, random!
194
193
}
195
194
196
- /*
197
- Do not use Optional<Integer> since we have 2 layers of indirection here
198
- boxing/unboxing and put/get for Optional - inefficient
199
- */
200
- void listOfOptionalInt_boxingOverhead () {
201
- Optional <Integer > ssr1 = Optional .of (1234 );
202
- Optional <Integer > ssr2 = Optional .empty ();
203
- Optional <Integer > ssr3 = Optional .of (4531 );
204
-
205
- List <Optional <Integer >> listOptionalSSRCodes = List .of (ssr1 , ssr2 , ssr3 );
206
- List <Integer > SSRCodesList = listOptionalSSRCodes .stream ()
207
- .filter (Optional ::isPresent )
208
- .map (Optional ::get )
209
- .collect (Collectors .toList ());
210
-
211
- SSRCodesList .forEach (System .out ::println );
212
- }
213
-
214
- /*
215
- With specialization Clsas OptionalInt ..improved readability
216
- BUT missing some methods like map, flatMap etc ..
217
- */
218
- void listOfOptionalIntSpecialization () {
219
- OptionalInt ssr1 = OptionalInt .of (1234 );
220
- OptionalInt ssr2 = OptionalInt .empty ();
221
- OptionalInt ssr3 = OptionalInt .of (4531 );
222
-
223
- List <OptionalInt > listOptionalSSRCodes = List .of (ssr1 , ssr2 , ssr3 );
224
- List <Integer > SSRCodesList
225
- = listOptionalSSRCodes .stream ()
226
- .filter (OptionalInt ::isPresent )
227
- .map (OptionalInt ::getAsInt )
195
+ /*
196
+ List of Optional<Conflict>
197
+ */
198
+ void listOfOptionals () {
199
+ Optional <Conflict > optConflict1 = Optional .of (new Conflict (1 ));
200
+ Optional <Conflict > optConflict2 = Optional .empty ();
201
+ Optional <Conflict > optConflict3 = Optional .of (new Conflict (2 ));
202
+
203
+ List <Optional <Conflict >> listOptConflicts = List .of (optConflict1 , optConflict2 , optConflict3 );
204
+ List <Conflict > conflicts
205
+ = listOptConflicts .stream ()
206
+ .filter (Optional ::isPresent )
207
+ .map (Optional ::get )
228
208
.collect (Collectors .toList ());
229
209
230
- SSRCodesList .forEach (System .out ::println );
210
+ conflicts .forEach (System .out ::println );
231
211
}
232
212
233
213
/*
@@ -244,7 +224,7 @@ void listOfOptionalIntSpecialization() {
244
224
thus replacing isPresent/Get
245
225
- creates an empty Stream<> if Optional value is empty
246
226
*/
247
- void listOfOptionalConflictFlatMap () {
227
+ void listOfOptionalStreamFlatMap () {
248
228
Conflict nullConflict = null ;
249
229
Optional <Conflict > optionalc1 = Optional .empty ();
250
230
Optional <Conflict > optionalc2 = Optional .of (new Conflict ());
@@ -255,7 +235,6 @@ void listOfOptionalConflictFlatMap() {
255
235
List <Conflict > actualConflicts
256
236
= listOfOptionalConflicts .stream () //Stream<Optional<Conflict>>
257
237
.flatMap (Optional ::stream ) //Stream<Conflict>
258
- //.filter((c) -> (c.getConflictId() != 0))
259
238
.collect (Collectors .toList ());
260
239
261
240
actualConflicts .forEach (System .out ::println );
@@ -268,7 +247,7 @@ Conflict getDefaultConflict() {
268
247
269
248
private void sendToAllDistributedApplications (Conflict conflict ) {
270
249
//stub just to drive point home
271
- conflict .getConflictId (); //null?
250
+ conflict .getConflictId (); //null? possible yes!
272
251
}
273
252
274
253
class NoConflictException extends RuntimeException {
0 commit comments