/** * Returns a {@code Collector} that returns the {@code k} greatest (relative to the specified * {@code Comparator}) input elements, in descending order, as an unmodifiable {@code List}. Ties * are broken arbitrarily. * * <p>For example: * * <pre>{@code * Stream.of("foo", "quux", "banana", "elephant") * .collect(greatest(2, comparingInt(String::length))) * // returns {"elephant", "banana"} * }</pre> * * <p>This {@code Collector} uses O(k) memory and takes expected time O(n) (worst-case O(n log * k)), as opposed to e.g. {@code Stream.sorted(comparator.reversed()).limit(k)}, which currently * takes O(n log n) time and O(n) space. * * @throws IllegalArgumentException if {@code k < 0} * @since 22.0 */ public static <T> Collector<T, ?, List<T>> greatest(int k, Comparator<? super T> comparator) { return least(k, comparator.reversed()); }
/** * Returns a {@code Collector} that returns the {@code k} greatest (relative to the specified * {@code Comparator}) input elements, in descending order, as an unmodifiable {@code List}. Ties * are broken arbitrarily. * * <p>For example: * * <pre>{@code * Stream.of("foo", "quux", "banana", "elephant") * .collect(greatest(2, comparingInt(String::length))) * // returns {"elephant", "banana"} * }</pre> * * <p>This {@code Collector} uses O(k) memory and takes expected time O(n) (worst-case O(n log * k)), as opposed to e.g. {@code Stream.sorted(comparator.reversed()).limit(k)}, which currently * takes O(n log n) time and O(n) space. * * @throws IllegalArgumentException if {@code k < 0} * @since 22.0 */ public static <T> Collector<T, ?, List<T>> greatest(int k, Comparator<? super T> comparator) { return least(k, comparator.reversed()); }
public void testLeastCollector() { CollectorTester.of(Comparators.<Integer>least(2, Comparator.naturalOrder())) .expectCollects(Arrays.asList(1, 2), 1, 2, 3, 4, 5, 6) .expectCollects(Arrays.asList(1), 1) .expectCollects(Collections.emptyList()); }
/** * Returns a {@code Collector} that returns the {@code k} greatest (relative to the specified * {@code Comparator}) input elements, in descending order, as an unmodifiable {@code List}. Ties * are broken arbitrarily. * * <p>For example: * * <pre>{@code * Stream.of("foo", "quux", "banana", "elephant") * .collect(greatest(2, comparingInt(String::length))) * // returns {"elephant", "banana"} * }</pre> * * <p>This {@code Collector} uses O(k) memory and takes expected time O(n) (worst-case O(n log * k)), as opposed to e.g. {@code Stream.sorted(comparator.reversed()).limit(k)}, which currently * takes O(n log n) time and O(n) space. * * @throws IllegalArgumentException if {@code k < 0} * @since 22.0 */ public static <T> Collector<T, ?, List<T>> greatest(int k, Comparator<? super T> comparator) { return least(k, comparator.reversed()); }
/** * Returns a {@code Collector} that returns the {@code k} greatest (relative to the specified * {@code Comparator}) input elements, in descending order, as an unmodifiable {@code List}. Ties * are broken arbitrarily. * * <p>For example: * * <pre>{@code * Stream.of("foo", "quux", "banana", "elephant") * .collect(greatest(2, comparingInt(String::length))) * // returns {"elephant", "banana"} * }</pre> * * <p>This {@code Collector} uses O(k) memory and takes expected time O(n) (worst-case O(n log * k)), as opposed to e.g. {@code Stream.sorted(comparator.reversed()).limit(k)}, which currently * takes O(n log n) time and O(n) space. * * @throws IllegalArgumentException if {@code k < 0} * @since 22.0 */ public static <T> Collector<T, ?, List<T>> greatest(int k, Comparator<? super T> comparator) { return least(k, comparator.reversed()); }
public void testLeastCollector() { CollectorTester.of(Comparators.<Integer>least(2, Comparator.naturalOrder())) .expectCollects(Arrays.asList(1, 2), 1, 2, 3, 4, 5, 6) .expectCollects(Arrays.asList(1), 1) .expectCollects(Collections.emptyList()); }