package org.lucares.utils; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; public class CollectionUtils { public interface Compare { public boolean test(T valueA); public static Compare compare(Function keyExtractor, V value) { Objects.requireNonNull(keyExtractor); return t -> Objects.equals(keyExtractor.apply(t), value); } default Compare thenCompare(Compare other) { Objects.requireNonNull(other); return t -> { final boolean res = test(t); return res ? other.test(t) : false; }; } default Compare thenCompare(Function keyExtractor, V value) { return thenCompare(compare(keyExtractor, value)); } } public static List copySort(Collection collection, Comparator comparator) { final List result = new ArrayList(collection); Collections.sort(result, comparator); return result; } public static void mapInPlace(final List list, final Function mapper) { for (int i = 0; i < list.size(); i++) { final T value = list.get(i); final T newValue = mapper.apply(value); list.set(i, newValue); } } public static List map(final Collection list, final Function mapper) { final List result = new ArrayList<>(list.size()); for (final T t : list) { result.add(mapper.apply(t)); } return result; } public static List map(final T[] input, final Function mapper) { return Stream.of(input).map(mapper).collect(Collectors.toList()); } public static , T, R> O map(final Collection input, final O result, final Function mapper) { for (final T t : input) { final R e = mapper.apply(t); result.add(e); } return result; } public static Map createMapFromValues(final Iterable iterable, final Function keyMapper) { final Map result = new HashMap<>(); for (final V value : iterable) { final T key = keyMapper.apply(value); result.put(key, value); } return result; } public static Map createMapFromKeys(final Iterable iterable, final Function valueMapper) { final Map result = new HashMap<>(); for (final KEY key : iterable) { final VALUE value = valueMapper.apply(key); result.put(key, value); } return result; } public static List filter(final Collection collection, final Predicate predicate) { return collection.stream().filter(predicate).collect(Collectors.toList()); } public static int indexOf(final List list, final Predicate predicate) { for (int i = 0; i < list.size(); i++) { if (predicate.test(list.get(i))) { return i; } } return -1; } public static boolean contains(Collection collection, final Compare compare) { for (T t : collection) { boolean found = compare.test(t); if (found) { return true; } } return false; } public static long count(Collection collection, final Compare compare) { long count = 0; for (T t : collection) { boolean found = compare.test(t); if (found) { count++; } } return count; } public static > T removeAll(final T collection, final T remove, final Supplier generator) { final T result = generator.get(); result.addAll(collection); result.removeAll(remove); return result; } public static > T retainAll(final T collection, final T retain, final Supplier generator) { final T result = generator.get(); result.addAll(collection); result.retainAll(retain); return result; } }