Java 8比较器比较不链接

Mayur Kulkarni:

假设我有一对班

public class Pair<P, Q> {
    public P p;
    public Q q;


    public Pair(P p, Q q) {
        this.p = p;
        this.q = q;
    }

    public int firstValue() {
        return ((Number)p).intValue();
    }

    public int secondValue() {
        return ((Number)q).intValue();
    }
}

我希望先按第一个值排序,然后再按第二个值排序。现在,如果我这样做

List<Pair<Integer, Integer>> pairList = new ArrayList<>();
pairList.add(new Pair<>(1, 5));
pairList.add(new Pair<>(2, 2));
pairList.add(new Pair<>(2, 22));
pairList.add(new Pair<>(1, 22));
pairList.sort(Comparator.comparing(Pair::firstValue));

一切正常,列表按对的第一个值排序,但是如果我这样做

pairList.sort(Comparator.comparing(Pair::firstValue).thenComparing(Pair::secondValue));

它因错误而失败

Error:(24, 38) java: incompatible types: cannot infer type-variable(s) T,U
(argument mismatch; invalid method reference
  method firstValue in class DataStructures.Pair<P,Q> cannot be applied to given types
    required: no arguments
    found: java.lang.Object
    reason: actual and formal argument lists differ in length)

好的,所以它可能无法推断参数,所以如果我这样做

pairList.sort(Comparator.<Integer, Integer>comparing(Pair::firstValue)
                                          .thenComparing(Pair::secondValue));

它因错误而失败

Error:(24, 39) java: invalid method reference
non-static method firstValue() cannot be referenced from a static context

为什么它适用于compare()而不适用于compare()。thenComparing()?

shmosel:

该错误似乎与Pair的通用参数有关。一种解决方法是尝试使用显式类型:

pairList.sort(Comparator.<Pair>comparingInt(Pair::firstValue).thenComparingInt(Pair::secondValue));
//                       ^^^^^^

请注意,comparingInt()它减少了您需要指定的参数数量,并通过避免装箱提高了性能。

另一个解决方案是参数化类型引用:

pairList.sort(Comparator.comparingInt(Pair<?,?>::firstValue).thenComparingInt(Pair::secondValue));
//                                        ^^^^^

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章