2014-05-16 99 views
22

有人可以向我演示如何使用新的lambda语法在Java 8中按字母顺序对ArrayList进行排序。在Java 8中使用Lambda排序ArrayList

+2

我建议你阅读本:http://docs.oracle.com /javase/tutorial/java/javaOO/lambdaexpressions.html –

回答

36

对于字符串这样的工作

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

更好:arrayList.sort(String :: compareTo) –

+12

更好:['arrayList.sort(Comparator.naturalOrder())'](http://docs.oracle.com/javase/8/docs/api/java /util/Comparator.html#naturalOrder--) – Holger

+14

请注意,'.sort(String :: compareTo)和.sort(Comparator.naturalOrder())'将在任何小写字母之前对所有**大写字母进行排序。通常你想要的是'.sort(String :: compareToIgnoreCase)' –

23

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

import static java.util.Comparator.*; 

list.sort(naturalOrder()); 

...但如果你与String字段排序对象,那么它使得有些更有意义:

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

在函数式编程,你不使用旧的对象以对它们进行操作,但创建以这样的方式在新的一个:

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

这是不正确的,因为现在流不再由旧元素组成,而是由映射和过滤版本组成。考虑一下你想按人名分类的银行账户:如果你按照你的建议去做,那么你首先得到一系列的银行账户,最后得到一系列的人名,而你想最终得到一个再次流入银行账户。 – skiwi

+0

通常,当您以FP样式编写程序时,不需要迭代保存结果。所以,这全是一个**新**列表:list.stream()。sorted()不是对旧列表进行排序,而是创建新列表。 –

+0

这个列表刚刚变得毫无用处,因为你只有**这个人的名字(在我的例子中),并且你不能直接将它引回到他们的银行账户。 – skiwi

4

使用list.sort(String::compareToIgnoreCase)

使用list.sort(String::compareTo)list.sort(Comparator.naturalOrder())将给予不正确的(即。非字母)结果。它将之前排序任何大写字母所有小写字母,所以该阵列["aAAA","Zzz", "zzz"]被分拣到["Zzz", "aAAA", "zzz"]

3

假如你有一个你想按字母顺序排序的名称(字符串)列表。

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

其工作完美。

+0

'Comparator'完全不需要。 – River

0

一个非常通用的解决方案。将介绍一些StreamUtil

public class StreamUtil { 

    private StreamUtil() { 
    }  

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public static <TYPE> Comparator<TYPE> sort(Function<TYPE, ? extends Comparable> 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));