在Java 8中使用Lambda对ArrayList进行排序

有人能告诉我一个快速的例子,说明如何使用新的lambda语法在Java 8中按字母顺序对ArrayList进行排序。

对于字符串,这将起作用

 arrayList.sort((p1, p2) -> p1.compareTo(p2)); 

你只是排序String s? 如果是这样,你不需要lambdas; 毫无意义。 你这样做

 import static java.util.Comparator.*; list.sort(naturalOrder()); 

…虽然如果您使用String字段对对象进行排序,那么它会更有意义:

 list.sort(comparing(Foo::getString)); 

使用list.sort(String::compareToIgnoreCase)

使用list.sort(String::compareTo)list.sort(Comparator.naturalOrder())将给出不正确的(即非字母)结果。 它将在所有小写字母之前对任何大写字母进行排序,因此数组["aAAA","Zzz", "zzz"]将被排序为["Zzz", "aAAA", "zzz"]

假设您有要按字母顺序排序的名称列表(String)。

 List result = names.stream().sorted( Comparator.comparing(n->n.toString())).collect(Collectors.toList()); 

它的工作完美。

一个非常通用的解决方案是引入一些类似的StreamUtil

 public class StreamUtil { private StreamUtil() { } @SuppressWarnings({ "rawtypes", "unchecked" }) public static  Comparator sort(Function getterFunction, boolean descending) { if (descending) { return (o1, o2) -> getterFunction.apply(o2).compareTo(getterFunction.apply(o1)); } return (o1, o2) -> getterFunction.apply(o1).compareTo(getterFunction.apply(o2)); } } 

电话会看起来像

 list.stream().sorted(sort(YourClass::getSortProperty, true)); 

在函数式编程中,您不是使用旧对象来操作它们,而是以这种方式创建新对象:

 list.stream().sorted().map(blah-blah).filter(...)... 

最简洁:

 Collections.sort(stringList, String::compareToIgnoreCase);