Streams in Java 8 12 years ago
Java's Comparator type is more general (you don't necessarily need to project the type for comparison) and an existing abstraction. It's not hard to introduce a combinator to transform the representation as a library, as in:
countries.sorted(by(x -> x.population)).limit(3).map(x -> x.name)
where `by` looks something like: <S, T> Comparator<T> by(Projection<S, T> projection);
interface Projection<S, T> {
Comparable<S> project(T value);
}