package org.jabref.model.util; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; public class OptionalUtil { public static <T> List<T> toList(Optional<T> value) { if (value.isPresent()) { return Collections.singletonList(value.get()); } else { return Collections.emptyList(); } } /** * No longer needed in Java 9 where {@code Optional<T>.stream()} is added. */ public static <T> Stream<T> toStream(Optional<T> value) { if (value.isPresent()) { return Stream.of(value.get()); } else { return Stream.empty(); } } @SafeVarargs public static <T> List<T> toList(Optional<T>... values) { return Stream.of(values).flatMap(optional -> toList(optional).stream()).collect(Collectors.toList()); } public static <T, R> Stream<R> flatMapFromStream(Optional<T> value, Function<? super T, ? extends Stream<? extends R>> mapper) { return toStream(value).flatMap(mapper); } public static <T, R> Stream<R> flatMap(Optional<T> value, Function<? super T, ? extends Collection<? extends R>> mapper) { return toStream(value).flatMap(element -> mapper.apply(element).stream()); } public static <T> Boolean isPresentAnd(Optional<T> value, Predicate<T> check) { return value.isPresent() && check.test(value.get()); } public static <T, S, R> Optional<R> combine(Optional<T> valueOne, Optional<S> valueTwo, BiFunction<T, S, R> combine) { if (valueOne.isPresent() && valueTwo.isPresent()) { return Optional.ofNullable(combine.apply(valueOne.get(), valueTwo.get())); } else { return Optional.empty(); } } }