Java 8混淆-> String :: compareToIgnoreCase

时间:2019-02-23 18:21:02

标签: java java-8

有人可以帮助我理解以下内容吗:

// 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 :(得分:5)

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

完全匹配

答案 1 :(得分:0)

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

} }