String::compareToIgnoreCase
равен анонимному классу:
new Comparator<String>() {
@Override
public int compare(String s, String str) {
return s.compareToIgnoreCase(str);
}
};
Поэтому его можно присвоить переменной с типом Comparator<String>
:
Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
В то же время выражение aa::compareToIgnoreCase;
означает функцию со строковым параметром aa
, которая возвращает Integer.
new Function<String, Integer>() {
@Override
public Integer apply(String str) {
return aa.compareToIgnoreCase(str);
}
};
Или:
Function<String, Integer> fun = aa::compareToIgnoreCase;
Разница между String::compareToIgnoreCase;
и aa::compareToIgnoreCase;
заключается в том, что в первом случае нам нужно 2 параметра: строка, для которой метод compareToIgnoreCase
будетвызывается и строка, которая будет передана в этом методе.Он идеально соответствует сигнатуре int compare(T o1, T o2);
.
Во втором случае у вас уже есть один параметр (aa
).Так что вам нужен только один, который будет передан в compareToIgnoreCase
.Это точно соответствует R apply(T t);