Comparator.Comparing与lambda的两个参数

时间:2017-09-30 20:08:04

标签: java lambda java-8 comparator

我用非java 8方式编写了我的自定义比较器,如下所示,但即使在阅读了一些博客后也不清楚,如何使用Comparator.comparing样式语法使用lambda

class MyCustomComparator  implements Comparator<Integer> {
    @Override
    public int compare(Integer n1, Integer n2) {
        String ns1 = Integer.toString(n1) + Integer.toString(n2);
        String ns2 = Integer.toString(n2) + Integer.toString(n1);
        if (Integer.parseInt(ns1) > Integer.parseInt(ns2)) {
            return 1;
        } else if (Integer.parseInt(ns1) < Integer.parseInt(ns2))
            return -1;
        return 0;
    }
}

通常Comparator.comparing取lambda,其中大多数例子我说lamda没有参数。

2 个答案:

答案 0 :(得分:3)

Comparator.comparing允许您在比较之前指定要单独应用于每个对象的转换。由于您的Comparator需要两个参数才能应用其逻辑,因此您无法将其写为Comparator.comparing表达式。

答案 1 :(得分:3)

Comparator.comparing…工厂方法适用于创建比较转换值或要比较的元素属性的比较器,但不是必须组合两个值时。

但是你仍然可以使用没有工厂方法的lambda表达式实现比较器

Comparator<Integer> myCustomComparator = (n1, n2) -> {
    String ns1 = "" + n1 + n2, ns2 = "" + n2 + n1;
    return Integer.compare(Integer.parseInt(ns1), Integer.parseInt(ns2));
};