在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);