import java.time.LocalDateTime;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
class Untitled {
public static void main
(String[] args
) { List
<ExclusiveField
> exclusiveFields
= Arrays.
asList( ExclusiveField.
withBigIntegerValue(BigInteger.
ONE),
ExclusiveField.withDateValue(LocalDateTime.now()),
ExclusiveField.withStringValue("ABC")
);
for(ExclusiveField field : exclusiveFields) {
field.consume(
i
-> System.
out.
println("Value was a BigInteger: " + i
),
d
-> System.
out.
println("Value was a LocalDateTime: " + d
),
s
-> System.
out.
println("Value was a String: " + s
) );
}
}
}
interface ExclusiveField {
static ExclusiveField withBigIntegerValue
(BigInteger i
) { return (biM, dM, sM) -> biM.accept(i);
}
static ExclusiveField withDateValue(LocalDateTime d) {
return (biM, dM, sM) -> dM.accept(d);
}
static ExclusiveField withStringValue
(String s
) { return (biM, dM, sM) -> sM.accept(s);
}
void consume(
Consumer<BigInteger> bigIntegerMatcher, Consumer<LocalDateTime> dateMatcher, Consumer<String> stringMatcher);
default <R> R map(
Function
<BigInteger, R
> bigIntegerMatcher, Function
<LocalDateTime, R
> dateMatcher, Function
<String, R
> stringMatcher
) {
Stream.Builder<R> b = Stream.builder();
consume(adapt(bigIntegerMatcher, b),adapt(dateMatcher, b),adapt(stringMatcher, b));
return b.build().findFirst().get();
}
static <T,R> Consumer<T> adapt(Function<T,R> f, Consumer<R> c) {
return t -> c.accept(f.apply(t));
}
}
aW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOwppbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKCmNsYXNzIFVudGl0bGVkIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBMaXN0PEV4Y2x1c2l2ZUZpZWxkPiBleGNsdXNpdmVGaWVsZHMgPSBBcnJheXMuYXNMaXN0KAogICAgICAgICAgICBFeGNsdXNpdmVGaWVsZC53aXRoQmlnSW50ZWdlclZhbHVlKEJpZ0ludGVnZXIuT05FKSwKICAgICAgICAgICAgRXhjbHVzaXZlRmllbGQud2l0aERhdGVWYWx1ZShMb2NhbERhdGVUaW1lLm5vdygpKSwKICAgICAgICAgICAgRXhjbHVzaXZlRmllbGQud2l0aFN0cmluZ1ZhbHVlKCJBQkMiKQogICAgICAgICk7CgogICAgICAgIGZvcihFeGNsdXNpdmVGaWVsZCBmaWVsZCA6IGV4Y2x1c2l2ZUZpZWxkcykgewogICAgICAgICAgICBmaWVsZC5jb25zdW1lKAogICAgICAgICAgICAgICAgaSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbHVlIHdhcyBhIEJpZ0ludGVnZXI6ICIgKyBpKSwKICAgICAgICAgICAgICAgIGQgLT4gU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZSB3YXMgYSBMb2NhbERhdGVUaW1lOiAiICsgZCksCiAgICAgICAgICAgICAgICBzIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiVmFsdWUgd2FzIGEgU3RyaW5nOiAiICsgcykKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KaW50ZXJmYWNlIEV4Y2x1c2l2ZUZpZWxkIHsKICAgIHN0YXRpYyBFeGNsdXNpdmVGaWVsZCB3aXRoQmlnSW50ZWdlclZhbHVlKEJpZ0ludGVnZXIgaSkgewogICAgICAgIHJldHVybiAoYmlNLCBkTSwgc00pIC0+IGJpTS5hY2NlcHQoaSk7CiAgICB9CiAgICBzdGF0aWMgRXhjbHVzaXZlRmllbGQgd2l0aERhdGVWYWx1ZShMb2NhbERhdGVUaW1lIGQpIHsKICAgICAgICByZXR1cm4gKGJpTSwgZE0sIHNNKSAtPiBkTS5hY2NlcHQoZCk7CiAgICB9CiAgICBzdGF0aWMgRXhjbHVzaXZlRmllbGQgd2l0aFN0cmluZ1ZhbHVlKFN0cmluZyBzKSB7CiAgICAgICAgcmV0dXJuIChiaU0sIGRNLCBzTSkgLT4gc00uYWNjZXB0KHMpOwogICAgfQoKICAgIHZvaWQgY29uc3VtZSgKICAgICAgICBDb25zdW1lcjxCaWdJbnRlZ2VyPiBiaWdJbnRlZ2VyTWF0Y2hlciwgQ29uc3VtZXI8TG9jYWxEYXRlVGltZT4gZGF0ZU1hdGNoZXIsIENvbnN1bWVyPFN0cmluZz4gc3RyaW5nTWF0Y2hlcik7CgogICAgZGVmYXVsdCA8Uj4gUiBtYXAoCiAgICAgICAgRnVuY3Rpb248QmlnSW50ZWdlciwgUj4gYmlnSW50ZWdlck1hdGNoZXIsIEZ1bmN0aW9uPExvY2FsRGF0ZVRpbWUsIFI+IGRhdGVNYXRjaGVyLCBGdW5jdGlvbjxTdHJpbmcsIFI+IHN0cmluZ01hdGNoZXIpIHsKCiAgICAgICAgU3RyZWFtLkJ1aWxkZXI8Uj4gYiA9IFN0cmVhbS5idWlsZGVyKCk7CiAgICAgICAgY29uc3VtZShhZGFwdChiaWdJbnRlZ2VyTWF0Y2hlciwgYiksYWRhcHQoZGF0ZU1hdGNoZXIsIGIpLGFkYXB0KHN0cmluZ01hdGNoZXIsIGIpKTsKICAgICAgICByZXR1cm4gYi5idWlsZCgpLmZpbmRGaXJzdCgpLmdldCgpOwogICAgfQogICAgc3RhdGljIDxULFI+IENvbnN1bWVyPFQ+IGFkYXB0KEZ1bmN0aW9uPFQsUj4gZiwgQ29uc3VtZXI8Uj4gYykgewogICAgICAgIHJldHVybiB0IC0+IGMuYWNjZXB0KGYuYXBwbHkodCkpOwogICAgfQp9Cg==