Skip to content

Commit 2ac2665

Browse files
committed
Initial commit
1 parent 5d1aefd commit 2ac2665

File tree

2 files changed

+37
-58
lines changed

2 files changed

+37
-58
lines changed

src/com/mvpjava/Flight.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public String getAircraftID() {
1818
return aircraftID;
1919
}
2020

21-
public Optional<Conflict> probeForOptionalConfict() {
21+
public Optional<Conflict> probeForConflictReturningOptional() {
2222
conflict = this.probeAirSpace();
2323
return (conflict != null)
2424
? Optional.of(conflict)
2525
: Optional.empty();
2626
}
2727

28-
public Conflict probeForConfictLegacyClassic() {
28+
public Conflict probeForConfictPossiblyReturningNull() {
2929
conflict = this.probeAirSpace();
3030
return (conflict != null)
3131
? (conflict)

src/com/mvpjava/OptionalDemo.java

Lines changed: 35 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.List;
44
import java.util.NoSuchElementException;
55
import java.util.Optional;
6-
import java.util.OptionalInt;
76
import 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

Comments
 (0)