Путаница с Java 8 -> String :: compareToIgnoreCase - PullRequest
0 голосов
/ 23 февраля 2019

Может ли кто-нибудь помочь мне в понимании ниже:

// This works fine
List list= Arrays.asList("a","b","A","B"); 
str.sort(String::compareToIgnoreCase); 

Могу ли я назначить ссылку на метод выше для любой переменной?

???holder = String :: compareToIgnoreCase;

однако я могу назначить ссылку на объект без каких-либо проблем, таких как:

String aa = "aa"; 
Function compareFunction = aa::compareToIgnoreCase;

Заранее спасибо, Абдул

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019
public class Test {
public static void main(String args[]) {
  String str1 = "Strings are immutable";
  String str2 = "Strings are immutable";
  String str3 = "Integers are not immutable";

  int result = str1.compareToIgnoreCase( str2 );
  System.out.println(result);

  result = str2.compareToIgnoreCase( str3 );
  System.out.println(result);

  result = str3.compareToIgnoreCase( str1 );
  System.out.println(result);

}}

0 голосов
/ 23 февраля 2019

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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...