Ho letto il tutorial Java 8 su Espressioni lambda e non comprendo l'esempio metodo di riferimento per "riferimento ad un metodo di un oggetto arbitrario di un particolare tipo di istanza"Java 8 e metodo referenze - specificamente compareToIgnoreCase
In lo stesso tutorial è un esempio di "Riferimento a un metodo di istanza di un oggetto particolare" che sembra simile.
public int compareByName(Person a, Person b) {
return a.getName().compareTo(b.getName());
}
Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
posso vedere questo lavoro perché il metodo compareByName ha la stessa firma Comparator.compare, lambda (a, b) -> myComparisonProvider.compareByName (a, b) prende due argomenti e chiama un metodo con il stessi due argomenti.
Ora il "riferimento ad un metodo di un oggetto arbitrario di un particolare tipo di istanza" esempio utilizza String :: compareToIgnoreCase
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
La firma di tale metodo è int compareTo(String anotherString)
ed è diverso Comparator.compare. Il tutorial non è molto chiaro ma sembra implicare che si finisce con un lambda come (a, b) -> a.compareToIgnoreCase (b) Non capisco come il compilatore decida cosa è accettabile per il secondo parametro di Arrays.sort I ho pensato che forse è abbastanza intelligente da capire come chiamare quel metodo, quindi ho creato un esempio.
public class LambdaTest {
public static void main(String... args) {
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase); // This works
// using Static methods
Arrays.sort(stringArray, FakeString::compare); // This compiles
Arrays.sort(stringArray, FakeString::compareToIgnoreCase); // This does not
// using Instance methods
LambdaTest lt = new LambdaTest();
FakeString2 fs2 = lt.new FakeString2();
Arrays.sort(stringArray, fs2::compare); // This compiles
Arrays.sort(stringArray, fs2::compareToIgnoreCase); // This does not
for(String name : stringArray){
System.out.println(name);
}
}
static class FakeString {
public static int compareToIgnoreCase(String a) {
return 0;
}
public static int compare(String a, String b) {
return String.CASE_INSENSITIVE_ORDER.compare(a, b);
}
}
class FakeString2 implements Comparator<String> {
public int compareToIgnoreCase(String a) {
return 0;
}
@Override
public int compare(String a, String b) {
return String.CASE_INSENSITIVE_ORDER.compare(a, b);
}
}
}
qualcuno può spiegare perché due precedenti Arrays.sort non si compilano anche se non stanno usando metodi che sono lo stesso come metodo di String.compareToIgnoreCase
prega di fare riferimento [String :: compareToIgnoreCase su StackOverflow] (https://stackoverflow.com/questions/39073799/type-inference-in-method-reference) –