如何将以下比较器转换为Comparator.comparing?

问题描述 投票:2回答:3

我的问题可能不清楚,所以让我通过示例将其清除:

Arrays.sort(arr, new Comparator<String>(){
    public int compare(String a, String b){
        return (b + a).compareTo(a + b);
    }
});

我想使用Comparator.comparing。我尝试了以下方法:

Arrays.sort(arr, Comparator.comparing((a, b) -> (b + a).compareTo((String)a + b)));

我收到一个错误-lamdba表达式中的返回类型错误。如何解决呢?

java arrays java-8 comparator
3个回答
1
投票

正如已经回答的,您的匿名类实现可以简化为lambda表达式:

Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));

如果您insist使用Comparator.comparing(),请记住它具有不适合您的排序问题的特定参数。

  • Comparator.comparing(keyExtractor)根据自然比较方式(Comparator.comparing(keyExtractor))为某些键返回指定的Comparator。您的方法不是说要比较[[what,而是说是[[how。]]Comparator.naturalOrder看起来更好一点,因为您可以指定
  • 如何
  • 使用Comparator.naturalOrder比较指定的键。您可以使用比较逻辑,并得出以下结论:

    Comparator.comparing(keyExtractor, keyComparator)

    这是使用Comparator.comparing(keyExtractor, keyComparator)的解决方案,该解决方案使用keyComparatorArrays.sort(arr, Comparator.comparing( Function.identity(), // keyExtractor, WHAT is compared (a, b) -> (b + a).compareTo(a + b))); // keyComparator, HOW is it compared 返回输入(与Comparator.comparing lambda表达式相同),因为您仍想比较字符串,但是用自定义指定的方式不同keyExtractor,因此,根据需要对数组进行排序的唯一正确方法是省略了Function.identity()的简化版本:
    str -> str

    ...终于是我们开始的地方。


5
投票

3
投票
© www.soinside.com 2019 - 2024. All rights reserved.