aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main/java/com/yahoo/collections/Optionals.java
diff options
context:
space:
mode:
authorbjormel <bjormel@yahooinc.com>2023-10-26 13:59:28 +0000
committerbjormel <bjormel@yahooinc.com>2023-10-26 13:59:28 +0000
commit567be9a1f6353cec41c23bfd1fcd46b4b2a4d2d7 (patch)
tree4664a743e166a5e11aee7b9acd70ad8ee2617612 /vespajlib/src/main/java/com/yahoo/collections/Optionals.java
parente9058b555d4dfea2f6c872d9a677e8678b569569 (diff)
parentbce3b8e926bf9da880172acbe1ba4b12d5e026d6 (diff)
Merge branch 'master' into bjormel/aws-main-controllerbjormel/aws-main-controller
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/collections/Optionals.java')
-rw-r--r--vespajlib/src/main/java/com/yahoo/collections/Optionals.java54
1 files changed, 54 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/collections/Optionals.java b/vespajlib/src/main/java/com/yahoo/collections/Optionals.java
new file mode 100644
index 00000000000..27a1e837900
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/collections/Optionals.java
@@ -0,0 +1,54 @@
+package com.yahoo.collections;
+
+import com.google.common.collect.Comparators;
+
+import java.util.Optional;
+import java.util.function.BinaryOperator;
+
+/**
+ * @author jonmv
+ */
+public class Optionals {
+
+ private Optionals() { }
+
+ /** Returns the first non-empty optional, or empty if all are empty. */
+ @SafeVarargs
+ public static <T> Optional<T> firstNonEmpty(Optional<T>... optionals) {
+ for (Optional<T> optional : optionals)
+ if (optional.isPresent())
+ return optional;
+ return Optional.empty();
+ }
+
+ /** Returns the non-empty optional with the lowest value, or empty if all are empty. */
+ @SafeVarargs
+ public static <T extends Comparable<T>> Optional<T> min(Optional<T>... optionals) {
+ Optional<T> best = Optional.empty();
+ for (Optional<T> optional : optionals)
+ if (best.isEmpty() || optional.isPresent() && optional.get().compareTo(best.get()) < 0)
+ best = optional;
+ return best;
+ }
+
+ /** Returns the non-empty optional with the highest value, or empty if all are empty. */
+ @SafeVarargs
+ public static <T extends Comparable<T>> Optional<T> max(Optional<T>... optionals) {
+ Optional<T> best = Optional.empty();
+ for (Optional<T> optional : optionals)
+ if (best.isEmpty() || optional.isPresent() && optional.get().compareTo(best.get()) > 0)
+ best = optional;
+ return best;
+ }
+
+ /** Returns whether either optional is empty, or both are present and equal. */
+ public static <T> boolean equalIfBothPresent(Optional<T> first, Optional<T> second) {
+ return first.isEmpty() || second.isEmpty() || first.equals(second);
+ }
+
+ /** Returns whether the optional is empty, or present and equal to the given value. */
+ public static <T> boolean emptyOrEqual(Optional<T> optional, T value) {
+ return optional.isEmpty() || optional.equals(Optional.of(value));
+ }
+
+}