package de.axone.data.weighted; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; public interface WeightedCollection<W extends WeightedCollection<W, T>, T> extends Iterable<T>{ public double weight(); public double maxWeight(); public double avgWeight(); public Set<T> asSet(); public List<T> asList(); public List<T> sorted(); public List<T> sorted( Comparator<T> comparator ); public List<T> shuffled(); public List<T> shuffledStable(); public W copy(); public W best( int amount, Predicate<T> filter ); public W best( int amount ); public W filter( Predicate<T> filter ); public W normalized(); public Stream<T> stream(); public Stream<T> sortedStream(); public Stream<T> bestStream( int amount, Predicate<T> filter ); public Stream<T> bestStream( int amount ); public Stream<T> filteredStream( Predicate<T> filter ); public Stream<T> normalizedStream(); public W add( T item ); public W addIf( T item, Predicate<T> condition ); public W addAll( W items ); public W addAll( Collection<? extends T> items ); public W removeAll( W items ); public W retainAll( W items ); public W distinct( W items ); public boolean contains( T item ); public int size(); public Optional<T> findFirst( Predicate<? super T> predicate ); public Optional<T> findFirst( String name, Function<T,String> namer ); @FunctionalInterface public interface Weighter<T> { public double weight( T item ); } @FunctionalInterface public interface Cloner<T> { public T clone( T item, double newWeight ); } @FunctionalInterface public interface Combiner<T> { public T combine( T item1, T item2 ); } public interface Metrics { public double weight(); public double max(); public double avg(); } }