All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.alapierre.func.Predicates Maven / Gradle / Ivy

The newest version!
package io.alapierre.func;

import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author Adrian Lapierre {@literal [email protected]}
 * Copyrights by original author 2020.10.02
 */
public class Predicates {

    public static  Predicate notNull() {
        return (Predicate) Objects::nonNull;
    }

    /**
     * Ogranicza do unikalnych elementów wg podanego klucza
     *
     * @param keyExtractor funkcja mapująca element do wartości po jakiej ma być wykonany distinct
     * @param  typ elementu kolekcji
     * @return predykat do użycia w metodzie filter
     */
    public static  Predicate distinctByKey(@NotNull Function keyExtractor) {
        Set seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }

    /**
     * weryfikuje czy przekazana kolekcja da się zmapować do jednego unikalnego elementu, zgodnie z przekazaną
     * funkcją mapującą.
     *
     * @param input kolekcja wejściowa
     * @param mapper funkcja mapująca elementy kolekcji na element, który ma być unikalny
     * @param  typ elementu kolekcji
     * @param  typ wynikowy funkcji mapującej
     * @return unikalny element
     * @throws RuntimeException jeśli po zmapowaniu unikalnych elementów nie jest dokładnie jeden
     */
    public static  R uniqueOrThrow(@NotNull Collection input, @NotNull Function mapper) {
        List res = input.stream()
                .map(mapper)
                .distinct()
                .collect(Collectors.toList());

        if(res.size() != 1)
            throw new RuntimeException("Expected exactly 1 distinct element but get " + res.size());

        return res.get(0);
    }

    /**
     * Returns a predicate that evaluates to true if the object reference being tested is a member of the given collection.
     *
     * @param target the collection that may contain the function input
     * @param  typ elementu kolekcji
     * @return predicate for use in filter method
     */
    public static  Predicate in(@NotNull Collection target) {
        return target::contains;
    }

    /**
     * Returns a predicate that evaluates to true if the object reference being tested is NOT a member of the given collection.
     *
     * @param target the collection that may contain the function input
     * @param  typ elementu kolekcji
     * @return predicate for use in filter method
     */
    public static  Predicate notIn(@NotNull Collection target) {
        return t-> !target.contains(t);
    }

    /**
     * Returns a predicate that evaluates to true if the object reference being tested is a member of the given collection.
     *
     * @param target the collection that may contain the function input
     * @param mapper function transform T in R
     * @param  typ elementu kolekcji użytej do filtrowania
     * @param  typ elementu wejściowego
     * @return predicate for use in filter method
     */
    public static  Predicate in(@NotNull Collection target, @NotNull Function mapper) {
        return t -> target.contains(mapper.apply(t));
    }

    /**
     * Returns a predicate that evaluates to true if the object reference being tested is NOT a member of the given collection.
     *
     * @param target the collection that may contain the function input
     * @param mapper function transform T in R
     * @param  typ elementu kolekcji użytej do filtrowania
     * @param  typ elementu wejściowego
     * @return predicate for use in filter method
     */
    public static  Predicate notIn(@NotNull Collection target, @NotNull Function mapper) {
        return t -> !target.contains(mapper.apply(t));
    }

}