BAEL-2776 Chaining Optionals in Java 8 (#6502)
* BAEL-2776 Chaining Optionals in Java 8 * BAEL-2776 Improvements after the first review
This commit is contained in:
parent
266864a56b
commit
c59211f756
@ -0,0 +1,110 @@
|
|||||||
|
package com.baeldung.java8.optional;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class OptionalChainingUnitTest {
|
||||||
|
|
||||||
|
private boolean getEmptyEvaluated;
|
||||||
|
private boolean getHelloEvaluated;
|
||||||
|
private boolean getByeEvaluated;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
getEmptyEvaluated = false;
|
||||||
|
getHelloEvaluated = false;
|
||||||
|
getByeEvaluated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenThreeOptionals_whenChaining_thenFirstNonEmptyIsReturned() {
|
||||||
|
Optional<String> found = Stream.of(getEmpty(), getHello(), getBye())
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.map(Optional::get)
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
assertEquals(getHello(), found);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoEmptyOptionals_whenChaining_thenEmptyOptionalIsReturned() {
|
||||||
|
Optional<String> found = Stream.of(getEmpty(), getEmpty())
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.map(Optional::get)
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
assertFalse(found.isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoEmptyOptionals_whenChaining_thenDefaultIsReturned() {
|
||||||
|
String found = Stream.<Supplier<Optional<String>>>of(
|
||||||
|
() -> createOptional("empty"),
|
||||||
|
() -> createOptional("empty")
|
||||||
|
)
|
||||||
|
.map(Supplier::get)
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.map(Optional::get)
|
||||||
|
.findFirst()
|
||||||
|
.orElseGet(() -> "default");
|
||||||
|
|
||||||
|
assertEquals("default", found);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenThreeOptionals_whenChaining_thenFirstNonEmptyIsReturnedAndRestNotEvaluated() {
|
||||||
|
Optional<String> found = Stream.<Supplier<Optional<String>>>of(this::getEmpty, this::getHello, this::getBye)
|
||||||
|
.map(Supplier::get)
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.map(Optional::get)
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
assertTrue(this.getEmptyEvaluated);
|
||||||
|
assertTrue(this.getHelloEvaluated);
|
||||||
|
assertFalse(this.getByeEvaluated);
|
||||||
|
assertEquals(getHello(), found);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoOptionalsReturnedByOneArgMethod_whenChaining_thenFirstNonEmptyIsReturned() {
|
||||||
|
Optional<String> found = Stream.<Supplier<Optional<String>>>of(
|
||||||
|
() -> createOptional("empty"),
|
||||||
|
() -> createOptional("hello")
|
||||||
|
)
|
||||||
|
.map(Supplier::get)
|
||||||
|
.filter(Optional::isPresent)
|
||||||
|
.map(Optional::get)
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
assertEquals(createOptional("hello"), found);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<String> getEmpty() {
|
||||||
|
this.getEmptyEvaluated = true;
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<String> getHello() {
|
||||||
|
this.getHelloEvaluated = true;
|
||||||
|
return Optional.of("hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<String> getBye() {
|
||||||
|
this.getByeEvaluated = true;
|
||||||
|
return Optional.of("bye");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<String> createOptional(String input) {
|
||||||
|
if (input == null || input == "" || input == "empty") {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.of(input);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user