首页 > 解决方案 > Java 8 混淆 - > String::compareToIgnoreCase

问题描述

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

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

我可以将上述方法引用分配给任何变量吗?

???持有人 = 字符串::compareToIgnoreCase;

但是我可以分配对象引用而不会出现任何问题,例如:

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

提前致谢, 阿卜杜勒

标签: javajava-8

解决方案


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返回整数的函数。

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


推荐阅读