Skip to content

Instantly share code, notes, and snippets.

@brake
Created February 3, 2018 19:26
Show Gist options
  • Save brake/366af1705e3ef6487aa4d37e16c7ec74 to your computer and use it in GitHub Desktop.
Save brake/366af1705e3ef6487aa4d37e16c7ec74 to your computer and use it in GitHub Desktop.
Java Union type snippet
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);
}
}
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