Skip to content

Commit

Permalink
#15 - Introduced number predicates
Browse files Browse the repository at this point in the history
  • Loading branch information
avegera committed Jul 16, 2024
1 parent 72dfd0f commit 6257fd0
Show file tree
Hide file tree
Showing 10 changed files with 913 additions and 10 deletions.
34 changes: 34 additions & 0 deletions src/main/java/io/github/avegera/predicate4j/Predicates.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,40 @@ public static <T extends Collection<R>, R> Predicate<T> notContainsElement(R ele
return collection -> collection == null || !collection.contains(element);
}

//Number predicates

public static <N extends Number & Comparable<N>> Predicate<N> isGreaterThan(N value) {
return number -> number != null && number.compareTo(value) > 0;
}

public static <N extends Number & Comparable<N>> Predicate<N> isLessThan(N value) {
return number -> number != null && number.compareTo(value) < 0;
}

public static <N extends Number & Comparable<N>> Predicate<N> isGreaterThanOrEqualTo(N value) {
return number -> number != null && number.compareTo(value) >= 0;
}

public static <N extends Number & Comparable<N>> Predicate<N> isLessThanOrEqualTo(N value) {
return number -> number != null && number.compareTo(value) <= 0;
}

public static <N extends Number & Comparable<N>> Predicate<N> isBetween(N startInclusive, N endInclusive) {
return number -> number != null && number.compareTo(startInclusive) >= 0 && number.compareTo(endInclusive) <= 0;
}

public static <N extends Number & Comparable<N>> Predicate<N> notBetween(N startInclusive, N endInclusive) {
return number -> number == null || number.compareTo(startInclusive) < 0 || number.compareTo(endInclusive) > 0;
}

public static <N extends Number> Predicate<N> isEven() {
return number -> number != null && number.longValue() % 2 == 0;
}

public static <N extends Number> Predicate<N> isOdd() {
return number -> number != null && number.longValue() % 2 != 0;
}

//String predicates

public static Predicate<String> isEmptyString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ public interface RichPredicateConjunction<T> {

<R> WhereList<T, R> list(Function<T, List<R>> mapper);

<N extends Number & Comparable<N>> WhereNumber<T, N> number(Function<T, N> mapper);

WhereString<T> string(Function<T, String> mapper);
}
20 changes: 20 additions & 0 deletions src/main/java/io/github/avegera/predicate4j/api/WhereNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.github.avegera.predicate4j.api;

public interface WhereNumber<T, N extends Number> extends WhereObject<T, N> {

RichPredicate<T> isGreaterThan(N value);

RichPredicate<T> isGreaterThanOrEqualTo(N value);

RichPredicate<T> isLessThan(N value);

RichPredicate<T> isLessThanOrEqualTo(N value);

RichPredicate<T> isBetween(N startInclusive, N endInclusive);

RichPredicate<T> notBetween(N startInclusive, N endInclusive);

RichPredicate<T> isEven();

RichPredicate<T> isOdd();
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ public interface WhereType {

<T, R> WhereList<T, R> list(Function<T, List<R>> mapper);

<T, N extends Number & Comparable<N>> WhereNumber<T, N> number(Function<T, N> mapper);

<T> WhereString<T> string(Function<T, String> mapper);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.github.avegera.predicate4j.api.*;

import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

public class RichPredicateConjunctionImpl<T> implements RichPredicateConjunction<T> {
Expand All @@ -15,16 +16,25 @@ public RichPredicateConjunctionImpl(RichPredicate<T> previousPredicate) {

@Override
public WhereBoolean<T> booleanValue(Function<T, Boolean> mapper) {
return new WhereBooleanImpl<>(mapper, previousPredicate);
return getWhere(WhereBooleanImpl::new, mapper);
}

@Override
public <R> WhereList<T, R> list(Function<T, List<R>> mapper) {
return new WhereListImpl<>(mapper, previousPredicate);
return getWhere(WhereListImpl::new, mapper);
}

@Override
public <N extends Number & Comparable<N>> WhereNumber<T, N> number(Function<T, N> mapper) {
return getWhere(WhereNumberImpl::new, mapper);
}

@Override
public WhereString<T> string(Function<T, String> mapper) {
return new WhereStringImpl<>(mapper, previousPredicate);
return getWhere(WhereStringImpl::new, mapper);
}

private <R, W extends WhereObject<T, R>> W getWhere(BiFunction<Function<T, R>, RichPredicate<T>, W> constructor, Function<T, R> mapper) {
return constructor.apply(mapper, previousPredicate);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package io.github.avegera.predicate4j.impl;

import io.github.avegera.predicate4j.Predicates;
import io.github.avegera.predicate4j.api.RichPredicate;
import io.github.avegera.predicate4j.api.WhereNumber;

import java.util.function.Function;

public class WhereNumberImpl<T, N extends Number & Comparable<N>> extends WhereObjectImpl<T, N> implements WhereNumber<T, N> {

public WhereNumberImpl(Function<T, N> mapper) {
super(mapper);
}

public WhereNumberImpl(Function<T, N> mapper, RichPredicate<T> previousPredicate) {
super(mapper, previousPredicate);
}

@Override
public RichPredicate<T> isGreaterThan(N value) {
return getPredicate(Predicates.isGreaterThan(value));
}

@Override
public RichPredicate<T> isLessThan(N value) {
return getPredicate(Predicates.isLessThan(value));
}

@Override
public RichPredicate<T> isGreaterThanOrEqualTo(N value) {
return getPredicate(Predicates.isGreaterThanOrEqualTo(value));
}

@Override
public RichPredicate<T> isLessThanOrEqualTo(N value) {
return getPredicate(Predicates.isLessThanOrEqualTo(value));
}

@Override
public RichPredicate<T> isBetween(N startInclusive, N endInclusive) {
return getPredicate(Predicates.isBetween(startInclusive, endInclusive));
}

@Override
public RichPredicate<T> notBetween(N startInclusive, N endInclusive) {
return getPredicate(Predicates.notBetween(startInclusive, endInclusive));
}

@Override
public RichPredicate<T> isEven() {
return getPredicate(Predicates.isEven());
}

@Override
public RichPredicate<T> isOdd() {
return getPredicate(Predicates.isOdd());
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.github.avegera.predicate4j.impl;

import io.github.avegera.predicate4j.api.WhereBoolean;
import io.github.avegera.predicate4j.api.WhereList;
import io.github.avegera.predicate4j.api.WhereString;
import io.github.avegera.predicate4j.api.WhereType;
import io.github.avegera.predicate4j.api.*;

import java.util.List;
import java.util.function.Function;
Expand All @@ -20,6 +17,11 @@ public <T, R> WhereList<T, R> list(Function<T, List<R>> mapper) {
return new WhereListImpl<>(mapper);
}

@Override
public <T, N extends Number & Comparable<N>> WhereNumber<T, N> number(Function<T, N> mapper) {
return new WhereNumberImpl<>(mapper);
}

@Override
public <T> WhereString<T> string(Function<T, String> mapper) {
return new WhereStringImpl<>(mapper);
Expand Down
Loading

0 comments on commit 6257fd0

Please sign in to comment.