我如何通过 lambda 创建字符串比较器?

How i can create String comparator through lambda?

我正在尝试通过我自己的比较器对字符串列表进行排序。我看到了下面的开发人员列表模板。

//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());

我的代码:(这给了我编译错误)

List<String> s = new ArrayList<>();  
Collections.sort(s, (String a, String b)-> {
    return a.length() > b.length()
});

此代码未编译。有人可以帮我看看我在做什么吗?

Arrays.sort 用于排序 Arrays 不适用于 Collection 对象,使用 Collections.sort 排序 ArrayList

Collections.sort(s,(a,b)->a.length()-b.length());

而对应的lambda表达式是错误的(String a,String b)-> a.length() > b.length()其中return的布尔值。其中 Comparator.compare 应 return int 值。并且参数的类型也可以显式声明或者可以从上下文中推断出来。

int compare(T o1, T o2)

您也可以使用List.sort

s.sort((a,b)->a.length()-b.length());

您的代码有 2 个不相关的问题:

[1] lambda 有两种写法

您可以编写一个表达式作为 return 值:

s.sort((a, b) -> a.length() - b.length());

或者你可以涉及一个代码块;但如果你这样做,return(和分号)必须出现:

s.sort((a, b) -> {
    return a.length() - b.length();
});

一般来说,如果你能用一个表达式让它工作,就这样做;它更短。在您的示例中,您使用的是大括号(因此,第二种形式),但您没有 return 关键字,也没有所需的分号。

此外,lambda 参数的类型是可选的。一般来说,如果从上下文很清楚,就省略这些:(a, b) -> a.length() - b.length()

[2] 如果参数相等,比较器应该 return 0,如果 a 是 'smaller' 而不是 b,则为负数(任何负数,哪个都无关紧要),如果 a 比 b 'larger' 则为正数。您正在 returning 一个布尔值(您使用的是大于号;该表达式的结果是 'true' 或 'false';您需要一个数字。

这里的解决方案似乎很简单:改用减号。

[3] 额外提示:有一些实用方法可以根据字段进行比较:Comparator.comparingInt(String::length) 将以更易于阅读且不易出错的方式执行您想要的操作。另外,您可以只写 list.sort(comparator) 而不是 Collections.sort(list, comparator);更美观、更短、更地道。

让我们把它们放在一起:

List<String> s = new ArrayList<>();  
s.sort(Comparator.comparingInt(String::length));