短版本
概念上类似于:
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))));