33import java .util .List ;
44import java .util .NoSuchElementException ;
55import java .util .Optional ;
6- import java .util .OptionalInt ;
76import java .util .stream .Collectors ;
87
98/*
@@ -21,21 +20,20 @@ public static void main(String[] args) {
2120 OptionalDemo demo = new OptionalDemo ();
2221// Un-comment one at a time like in YouTube tutorial
2322
24- demo .theProblem ();
23+ // demo.theProblem();
2524// demo.theSolutionInTherory();
2625// demo.HowToCreateOptionals();
27- // demo.HowToRetrieveValuesFromOptionalSimpleImperative();
28- //
2926// demo.getValuesOutOfOptionalsUnguarded();
27+ // demo.HowToRetrieveValuesFromOptionalSimpleImperative();
3028// demo.optionalsFunctionalMap();
29+
3130// demo.getOrElseAlternative();
3231// demo.getOrElseGetAlternative();
3332// demo.getOptionalOrDefaultOptional();
3433// demo.getOrElseThrowAlternative();
3534//
36- // demo.listOfOptionalInt_boxingOverhead();
37- // demo.listOfOptionalIntSpecialization();
38- // demo.listOfOptionalConflictFlatMap();
35+ // demo.listOfOptionals();
36+ // demo.listOfOptionalStreamFlatMap();
3937 }
4038
4139 void theProblem () {
@@ -46,7 +44,7 @@ void theProblem() {
4644 int requestingFlightLevel = 36000 ;
4745
4846 if (actualFlightLevel != requestingFlightLevel ) {
49- Conflict conflict = flight .probeForConfictLegacyClassic ();
47+ Conflict conflict = flight .probeForConfictPossiblyReturningNull ();
5048 sendToAllDistributedApplications (conflict );
5149 }
5250 }
@@ -58,7 +56,7 @@ void theSolutionInTherory() {
5856 flight .setFlightLevel (actualFlightLevel ); //current Flight Level (FL)
5957
6058 if (actualFlightLevel != requestingFlightLevel ) {
61- Optional <Conflict > conflict = flight .probeForOptionalConfict ();
59+ Optional <Conflict > conflict = flight .probeForConflictReturningOptional ();
6260 //commented out to show that cant pass null by accident anymore
6361 //sendToAllDistributedApplications(conflict);
6462 }
@@ -88,13 +86,13 @@ void HowToCreateOptionals() {
8886 //DO NOT EVER DO THIS, defeats the entire purpose!!!
8987 //Optional.of(null);
9088 }
91-
89+
9290 /*
9391 Bad because using Optional.get() without checking if first value present.
9492 Might be ok, might not. your taking a chance
9593 */
9694 void getValuesOutOfOptionalsUnguarded () {
97- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict (); //random conflict returned
95+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional (); //random conflict returned
9896 //try/catch from demo sake
9997 try {
10098 Conflict conflict = optionalConflict .get ();
@@ -104,29 +102,28 @@ void getValuesOutOfOptionalsUnguarded() {
104102 System .out .println ("Un-guarded get()...got a NoSuchElementException exception!" );
105103 }
106104 }
107-
108105 /*
109106 Without use of Optional, written in the classical if/else == null way.
110107 versus entry level Optonal, imperative way
111108 */
112109 void HowToRetrieveValuesFromOptionalSimpleImperative () {
113110 //simple, non-Optional way
114- Conflict conflict = flight .probeForConfictLegacyClassic ();
111+ Conflict conflict = flight .probeForConfictPossiblyReturningNull ();
115112 if (conflict != null ) {
116113 System .out .println ("Conflict detected: " + conflict .getConflictId ());
117114 } else {
118115 System .out .println ("No Conflict" );
119116 }
120117
121118 //versus Optional - imperative way
122- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
119+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
123120 if (optionalConflict .isPresent ()) {
124121 System .out .println ("Conflict id: " + optionalConflict .get ());
125122 } else {
126123 System .out .println ("missing Conflict id" );
127124 }
128125 }
129-
126+
130127 /* Now using a function style of programming. The map method
131128 extracts the value of the Optional (if present) as per the
132129 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
140137 Note: if you don't care for "Else" then just use the ifPresent(Consumer<? super T> action)
141138 */
142139 void optionalsFunctionalMap () {
143- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
140+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
144141 optionalConflict
145142 .map (Conflict ::getConflictId )
146143 .ifPresentOrElse (System .out ::println ,
147144 () -> System .out .println ("No Conflicts detected" ));
148145 }
146+
147+ //END OF PART 1
149148
150149 /*
151150 .orElse() ALWAYS gets invoked, even if Optional is present.
152151 Possible performance overhead ..maybe, depends on what your creating.
153152 */
154153 Conflict getOrElseAlternative () {
155- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
154+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
156155 Conflict conflict = optionalConflict .orElse (getDefaultConflict ());
157156
158157 System .out .println ("orElse conflict id: " + conflict .getConflictId ());
@@ -164,7 +163,7 @@ Conflict getOrElseAlternative() {
164163 Great for returning a default value
165164 */
166165 Conflict getOrElseGetAlternative () {
167- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();
166+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();
168167 Conflict conflict = optionalConflict .orElseGet (() -> getDefaultConflict ());
169168
170169 System .out .println ("orElseGet conflict id: " + conflict .getConflictId ());
@@ -178,7 +177,7 @@ Conflict getOrElseGetAlternative() {
178177 Great for returning a default Optional
179178 */
180179 Optional <Conflict > getOptionalOrDefaultOptional () {
181- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();//random Conflict
180+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();//random Conflict
182181 return optionalConflict .or (() -> Optional .of (getDefaultConflict ()));
183182 }
184183
@@ -189,45 +188,26 @@ Optional<Conflict> getOptionalOrDefaultOptional() {
189188 NoSuchElementException if Optional is empty - since Java 10
190189 */
191190 Conflict getOrElseThrowAlternative () {
192- Optional <Conflict > optionalConflict = flight .probeForOptionalConfict ();//random Conflict
191+ Optional <Conflict > optionalConflict = flight .probeForConflictReturningOptional ();//random Conflict
193192 return optionalConflict .orElseThrow (NoConflictException ::new ); //might throw, random!
194193 }
195194
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 )
228208 .collect (Collectors .toList ());
229209
230- SSRCodesList .forEach (System .out ::println );
210+ conflicts .forEach (System .out ::println );
231211 }
232212
233213 /*
@@ -244,7 +224,7 @@ void listOfOptionalIntSpecialization() {
244224 thus replacing isPresent/Get
245225 - creates an empty Stream<> if Optional value is empty
246226 */
247- void listOfOptionalConflictFlatMap () {
227+ void listOfOptionalStreamFlatMap () {
248228 Conflict nullConflict = null ;
249229 Optional <Conflict > optionalc1 = Optional .empty ();
250230 Optional <Conflict > optionalc2 = Optional .of (new Conflict ());
@@ -255,7 +235,6 @@ void listOfOptionalConflictFlatMap() {
255235 List <Conflict > actualConflicts
256236 = listOfOptionalConflicts .stream () //Stream<Optional<Conflict>>
257237 .flatMap (Optional ::stream ) //Stream<Conflict>
258- //.filter((c) -> (c.getConflictId() != 0))
259238 .collect (Collectors .toList ());
260239
261240 actualConflicts .forEach (System .out ::println );
@@ -268,7 +247,7 @@ Conflict getDefaultConflict() {
268247
269248 private void sendToAllDistributedApplications (Conflict conflict ) {
270249 //stub just to drive point home
271- conflict .getConflictId (); //null?
250+ conflict .getConflictId (); //null? possible yes!
272251 }
273252
274253 class NoConflictException extends RuntimeException {
0 commit comments