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;
}
}
Ok, come avete capito questo codice sta stampando le mie chiavi coppia dal valore più basso associato al più alto in modo da ottenere i risultati attesi:malinteso circa comparatore in Java 8
Fin qui tutto bene. Ora volevo fare il contrario, ho pensato che avrei dovuto solo fare
list.stream()
.sorted(Comparator.comparingInt(p -> p.v).reversed())
.map(p -> p.k)
.forEach(System.out::println);
Ma ottengo un errore di compilazione:
v cannot be resolved or is not a field
Così sembra comparingInt
restituisce un Comparator<Object>
. Perché è così? Non dovrebbe restituire un Comparator<Integer>
?
Questi sono entrambi riproducibili con Eclipse Luna versione 1 e javac.
javac -version => 1.8.0
java -version => java version "1.8.0_25"
Oh anche sentirsi liberi di cambiare il titolo della mia domanda è lo trovate troppo generale, ma non riuscivo a trovare i termini corretti
Probabilmente funzionerà con Comparator.reverseOrder. – assylias
@assy lias Beh, come potrei ottenerlo con reverseOrder? Significherebbe che i miei oggetti coppia sono già comparabili. – user2336315
Ho risposto qui: http://stackoverflow.com/questions/25172595/comparator-reversed-not-compiles-using-lambda –