Created
February 3, 2018 19:26
-
-
Save brake/366af1705e3ef6487aa4d37e16c7ec74 to your computer and use it in GitHub Desktop.
Java Union type snippet
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
final class SuccessOrFailure extends Union<String, SomeErrorType> { | |
private SuccessOrFailure(final String result, final SomeErrorType someError) { | |
super(result, someError); | |
} | |
public static SuccessOrFailure createFromSuccess(final String result) { | |
return new SuccessOrFailure(result, null); | |
} | |
public static SuccessOrFailure createFromFailure(final SomeErrorType someError) { | |
return new SuccessOrFailure(null, someError); | |
} | |
} |
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.BiFunction; | |
import java.util.function.Consumer; | |
import java.util.stream.Stream; | |
/** | |
* Container for object with one of two possible types | |
*/ | |
class Union<T1, T2> { | |
private final Optional<T1> first; | |
private final Optional<T2> second; | |
Union(T1 first, T2 second) { | |
assert (first == null && second != null) || (first != null && second == null); | |
this.first = Optional.ofNullable(first); | |
this.second = Optional.ofNullable(second); | |
} | |
public boolean isFirstPresent() { | |
return first.isPresent(); | |
} | |
public boolean isSecondPresent() { | |
return second.isPresent(); | |
} | |
public <U> Stream<U> map(BiFunction<T1, T2, U> function) { | |
return Stream.of(function.apply(first.orElse(null), second.orElse(null))); | |
} | |
public void forEach(Consumer<? super T1> whenValue1, Consumer<? super T2> whenValue2) { | |
first.ifPresent(whenValue1); | |
second.ifPresent(whenValue2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment