diff --git a/pom.xml b/pom.xml index 2ff3a792..7fd02807 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,11 @@ + + org.jspecify + jspecify + 1.0.0 + org.junit.jupiter junit-jupiter-api diff --git a/src/main/java/com/github/underscore/Underscore.java b/src/main/java/com/github/underscore/Underscore.java index 01541df7..b19f9974 100644 --- a/src/main/java/com/github/underscore/Underscore.java +++ b/src/main/java/com/github/underscore/Underscore.java @@ -52,6 +52,8 @@ import java.util.function.Predicate; import java.util.function.Supplier; import java.util.function.UnaryOperator; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; /** * Underscore-java is a java port of Underscore.js. @@ -99,24 +101,24 @@ public class Underscore { ESCAPES.put('`', "`"); } - public Underscore(final Iterable iterable) { + public Underscore(final @NonNull Iterable iterable) { this.iterable = iterable; this.string = Optional.empty(); } - public Underscore(final String string) { + public Underscore(final @NonNull String string) { this.iterable = null; this.string = Optional.of(string); } private static void setTemplateKey( - final Map templateSettings, final String key) { + final @NonNull Map templateSettings, final @NonNull String key) { if (templateSettings.containsKey(key) && templateSettings.get(key).contains(ALL_SYMBOLS)) { TEMPLATE_SETTINGS.put(key, templateSettings.get(key)); } } - public static void templateSettings(final Map templateSettings) { + public static void templateSettings(final @NonNull Map templateSettings) { setTemplateKey(templateSettings, EVALUATE); setTemplateKey(templateSettings, INTERPOLATE); setTemplateKey(templateSettings, ESCAPE); @@ -125,12 +127,12 @@ public static void templateSettings(final Map templateSettings) private static final class WherePredicate implements Predicate { private final List> properties; - private WherePredicate(List> properties) { + private WherePredicate(@NonNull List> properties) { this.properties = properties; } @Override - public boolean test(final E elem) { + public boolean test(final @NonNull E elem) { for (Map.Entry prop : properties) { try { if (!elem.getClass() @@ -290,14 +292,14 @@ public static Function, V> iteratee(final K key) { /* * Documented, #each */ - public static void each(final Iterable iterable, final Consumer func) { + public static void each(final @NonNull Iterable iterable, final @NonNull Consumer func) { for (T element : iterable) { func.accept(element); } } public static void eachIndexed( - final Iterable iterable, final BiConsumer func) { + final @NonNull Iterable iterable, final @NonNull BiConsumer func) { int index = 0; for (T element : iterable) { func.accept(index, element); @@ -305,48 +307,48 @@ public static void eachIndexed( } } - public void each(final Consumer func) { + public void each(final @NonNull Consumer func) { each(iterable, func); } - public static void eachRight(final Iterable iterable, final Consumer func) { + public static void eachRight(final @NonNull Iterable iterable, @NonNull final Consumer func) { each(reverse(iterable), func); } - public void eachRight(final Consumer func) { + public void eachRight(final @NonNull Consumer func) { eachRight(iterable, func); } - public static void forEach(final Iterable iterable, final Consumer func) { + public static void forEach(final @NonNull Iterable iterable, final @NonNull Consumer func) { each(iterable, func); } public static void forEachIndexed( - final Iterable iterable, final BiConsumer func) { + final @NonNull Iterable iterable, final @NonNull BiConsumer func) { eachIndexed(iterable, func); } - public void forEach(final Consumer func) { + public void forEach(final @NonNull Consumer func) { each(iterable, func); } - public void forEachIndexed(final BiConsumer func) { + public void forEachIndexed(final @NonNull BiConsumer func) { eachIndexed(iterable, func); } public static void forEachRight( - final Iterable iterable, final Consumer func) { + final @NonNull Iterable iterable, final @NonNull Consumer func) { eachRight(iterable, func); } - public void forEachRight(final Consumer func) { + public void forEachRight(final @NonNull Consumer func) { eachRight(iterable, func); } /* * Documented, #map */ - public static List map(final List list, final Function func) { + public static List map(final @NonNull List list, final @NonNull Function func) { final List transformed = newArrayListWithExpectedSize(list.size()); for (E element : list) { transformed.add(func.apply(element)); @@ -355,7 +357,7 @@ public static List map(final List list, final Function List mapMulti( - final List list, final BiConsumer> mapper) { + final @NonNull List list, final @NonNull BiConsumer> mapper) { final List transformed = newArrayListWithExpectedSize(list.size()); for (E element : list) { Consumer value = transformed::add; @@ -364,11 +366,11 @@ public static List mapMulti( return transformed; } - public List map(final Function func) { + public List map(final @NonNull Function func) { return map(newArrayList(iterable), func); } - public static List map(final int[] array, final Function func) { + public static List map(final @NonNull int[] array, final @NonNull Function func) { final List transformed = newArrayListWithExpectedSize(array.length); for (int element : array) { transformed.add(func.apply(element)); @@ -376,7 +378,7 @@ public static List map(final int[] array, final Function Set map(final Set set, final Function func) { + public static Set map(final @NonNull Set set, final @NonNull Function func) { final Set transformed = newLinkedHashSetWithExpectedSize(set.size()); for (E element : set) { transformed.add(func.apply(element)); @@ -385,7 +387,7 @@ public static Set map(final Set set, final Function f } public static List mapIndexed( - final List list, final BiFunction func) { + final @NonNull List list, final @NonNull BiFunction func) { final List transformed = newArrayListWithExpectedSize(list.size()); int index = 0; for (E element : list) { @@ -396,7 +398,7 @@ public static List mapIndexed( } public static List replace( - final Iterable iter, final Predicate pred, final T value) { + final @NonNull Iterable iter, final @Nullable Predicate pred, final @Nullable T value) { List list = newArrayList(iter); if (pred == null) { return list; @@ -410,12 +412,12 @@ public static List replace( return list; } - public List replace(final Predicate pred, final T value) { + public List replace(final @Nullable Predicate pred, final @Nullable T value) { return replace(value(), pred, value); } public static List replaceIndexed( - final Iterable iter, final PredicateIndexed pred, final T value) { + final @NonNull Iterable iter, final @Nullable PredicateIndexed pred, final @Nullable T value) { List list = newArrayList(iter); if (pred == null) { return list; @@ -431,19 +433,19 @@ public static List replaceIndexed( return list; } - public List replaceIndexed(final PredicateIndexed pred, final T value) { + public List replaceIndexed(final @Nullable PredicateIndexed pred, final @Nullable T value) { return replaceIndexed(value(), pred, value); } - public List mapIndexed(final BiFunction func) { + public List mapIndexed(final @NonNull BiFunction<@NonNull Integer, ? super T, F> func) { return mapIndexed(newArrayList(iterable), func); } - public static List collect(final List list, final Function func) { + public static List collect(final @NonNull List list, final @NonNull Function func) { return map(list, func); } - public static Set collect(final Set set, final Function func) { + public static Set collect(final @NonNull Set set, final @NonNull Function func) { return map(set, func); } @@ -451,7 +453,8 @@ public static Set collect(final Set set, final Function E reduce( - final Iterable iterable, final BiFunction func, final E zeroElem) { + final @NonNull Iterable iterable, final @NonNull BiFunction<@NonNull E, T, E> func, + final @NonNull E zeroElem) { E accum = zeroElem; for (T element : iterable) { accum = func.apply(accum, element); @@ -459,7 +462,7 @@ public static E reduce( return accum; } - public static Optional reduce(final Iterable iterable, final BinaryOperator func) { + public static Optional reduce(final @NonNull Iterable iterable, final @NonNull BinaryOperator func) { boolean foundAny = false; T accum = null; for (T element : iterable) { @@ -474,7 +477,8 @@ public static Optional reduce(final Iterable iterable, final BinaryOpe } public static E reduce( - final int[] array, final BiFunction func, final E zeroElem) { + final @NonNull int[] array, final @NonNull BiFunction func, + final @NonNull E zeroElem) { E accum = zeroElem; for (int element : array) { accum = func.apply(accum, element); @@ -483,7 +487,7 @@ public static E reduce( } public static E reduce( - final T[] array, final BiFunction func, final E zeroElem) { + final @NonNull T[] array, final @NonNull BiFunction func, final @NonNull E zeroElem) { E accum = zeroElem; for (T element : array) { accum = func.apply(accum, element);