Created
December 2, 2015 10:33
-
-
Save jotak/f0c676166807f9c2733b to your computer and use it in GitHub Desktop.
Optional improvements
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Optional; | |
import java.util.function.Consumer; | |
/** | |
* @author jtakvorian | |
*/ | |
public final class Optionals { | |
private Optionals() { | |
} | |
public static <T> ThenPresent<T> ifPresent(final Optional<T> opt) { | |
return executeThen -> { | |
opt.ifPresent(executeThen); | |
return executeElse -> { | |
if (!opt.isPresent()) { | |
executeElse.run(); | |
} | |
}; | |
}; | |
} | |
public static <T> ThenAbsent<T> ifAbsent(final Optional<T> opt) { | |
return executeThen -> { | |
if (!opt.isPresent()) { | |
executeThen.run(); | |
} | |
return opt::ifPresent; | |
}; | |
} | |
public interface ThenPresent<T> { | |
ElseAbsent then(final Consumer<T> execute); | |
} | |
public interface ThenAbsent<T> { | |
ElsePresent<T> then(final Runnable execute); | |
} | |
public interface ElsePresent<T> { | |
void _else(final Consumer<T> execute); | |
} | |
public interface ElseAbsent { | |
void _else(final Runnable execute); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import static org.assertj.core.api.Assertions.assertThat; | |
import java.util.Optional; | |
import java.util.concurrent.atomic.AtomicInteger; | |
import org.junit.Test; | |
/** | |
* @author jtakvorian | |
*/ | |
public class OptionalsTest { | |
@Test | |
public void shouldRunThenIfPresent() { | |
final Optional<Integer> someInt = Optional.of(5); | |
final AtomicInteger toBeSet = new AtomicInteger(); | |
Optionals.ifPresent(someInt) | |
.then(toBeSet::set) | |
._else(() -> toBeSet.set(10)); | |
assertThat(toBeSet.get()).isEqualTo(5); | |
} | |
@Test | |
public void shouldRunElseIfNotPresent() { | |
final Optional<Integer> someInt = Optional.empty(); | |
final AtomicInteger toBeSet = new AtomicInteger(); | |
Optionals.ifPresent(someInt) | |
.then(toBeSet::set) | |
._else(() -> toBeSet.set(10)); | |
assertThat(toBeSet.get()).isEqualTo(10); | |
} | |
@Test | |
public void shouldRunThenIfAbsent() { | |
final Optional<Integer> someInt = Optional.of(5); | |
final AtomicInteger toBeSet = new AtomicInteger(); | |
Optionals.ifAbsent(someInt) | |
.then(() -> toBeSet.set(10)) | |
._else(toBeSet::set); | |
assertThat(toBeSet.get()).isEqualTo(5); | |
} | |
@Test | |
public void shouldRunElseIfNotAbsent() { | |
final Optional<Integer> someInt = Optional.empty(); | |
final AtomicInteger toBeSet = new AtomicInteger(); | |
Optionals.ifAbsent(someInt) | |
.then(() -> toBeSet.set(10)) | |
._else(toBeSet::set); | |
assertThat(toBeSet.get()).isEqualTo(10); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment