public class Test {
public static void main(String[] args) {
List<Pair<String, Integer>> list = new ArrayList<>();
list.add(new Pair<>("1", 8));
list.add(new Pair<>("3", 2));
list.add(new Pair<>("2", 15));
list.stream()
.sorted(Comparator.comparingInt(p -> p.v))
.map(p -> p.k)
.forEach(System.out::println);
}
}
class Pair<K, V> {
K k;
V v;
public Pair(K k, V v) {
this.k = k;
this.v = v;
}
}
Хорошо, как вы поняли этот код печатают ключи паров от минимального значения, связанного с самым высоким, поэтому я получить ожидаемый результат:Непонимания о Компараторе в Java 8
Пока все хорошо. Теперь я хотел бы сделать наоборот, я думал, что только сделать
list.stream()
.sorted(Comparator.comparingInt(p -> p.v).reversed())
.map(p -> p.k)
.forEach(System.out::println);
Но я получаю ошибку компиляции:
v cannot be resolved or is not a field
Так что похоже comparingInt
возвращается в Comparator<Object>
. Почему это так? Разве он не должен возвращать Comparator<Integer>
?
Они оба воспроизводятся с Eclipse Luna версии 1 и javac.
javac -version => 1.8.0
java -version => java version "1.8.0_25"
О, не стесняйтесь, чтобы изменить название моего вопроса вы находите это слишком общий характер, но я не мог найти правильные термины
Возможно, это будет работать с Comparator.reverseOrder. – assylias
@assy lias Хорошо, как бы я мог добиться этого с помощью reverseOrder? Это означало бы, что мои парные объекты уже сопоставимы. – user2336315
Отвечено здесь: http://stackoverflow.com/questions/25172595/comparator-reversed-not-compiles-using-lambda –