如何将此"Sort object field case insensitively"从比较器类转换为 lambda?



短版本

概念上类似于:

list.sort( StringUtils.compareIgnoreCase(o1.getID(), o2.getID() ));

长版本

我正在尝试对事物列表进行排序:

List<Thingy> list = getListOfThingies();

thingy有一个String成员,我想对其进行区分大小写排序

class Thingy {
private String id;
public getId() { return id; }
}

我知道列表有一个.sort方法:

default void sort(Comparator<? super E> c)

破译这种语法已经足够困难了,我设法拼凑出了一个Comparator<Thingy>类:

class MyThingySortCompator implements Comparator<Thingy> {
@Override
public int compare(Thingy o1, Thingy o2) {
String s1;
String s2;
if (o1 != null) s1 = o1.getId(); // thingy1 could be null - who knows
if (o2 != null) s2 = o2.getId(); // thingy2 could be null - who knows
//StringUtils handles if a string is null
int compareResult = StringUtils.compareIgnoreCase(s1, s2);
return compareResult;
}
}

然后我可以对我的列表进行排序:

List<Thingy> list = getListOfThingies();
Comparator<Thingy> myThingySortComparator = new MyThingySortCompator();
list.sort(myThingySortComparator);

这很有效,但很冗长。

我听说lambda语法可以在一行中做同样的事情(尽管很难阅读(。等效的lambda语法是什么?

研究工作

  • Java 8中使用Lambda对ArrayList进行排序
  • Lambda比较器排序列表
  • 在Java中使用lambda对另一个类中的对象列表进行排序
  • 如何使用lambda表达式基于一个变量对对象列表进行排序
  • 在Java中按字段对对象列表进行排序
  • 按字母顺序对arraylist排序(不区分大小写(
  • 使用区分大小写的String键对Java中的对象进行排序
import java.util.Comparator;
list.sort(Comparator.comparing(Thingy::getId, String.CASE_INSENSITIVE_ORDER));

或者,对于更常见的静态导入,

list.sort(comparing(Thingy::getId, CASE_INSENSITIVE_ORDER));

我认为这在可读性方面没有任何问题。

这不处理null——在我看来,不应该——但如果你想的话,你可以从Comparator进行另一个静态导入,这样你就可以编写

list.sort(nullsFirst(comparing(Thingy::getId, CASE_INSENSITIVE_ORDER))); 

或者如果Thingy.getId()也可能是null(为什么你的程序中允许null?它们几乎都表示错误(

list.sort(nullsFirst(comparing(Thingy::getId, nullsFirst(CASE_INSENSITIVE_ORDER))));

或者如果使用非静态导入:

using java.util.Comparator;
//Sort list, case insensitively, without crashing if a null is accidentally present.
list.sort(Comparator.nullsFirst(Comparator.comparing(Thingy::getId, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER))));

最新更新