web-dev-qa-db-ja.com

Java 8でLambdaを使用してArrayListをソートする

誰かが新しいラムダ構文を使用してJava 8でArrayListをアルファベット順にソートする方法の簡単な例を教えてもらえますか?.

34
Jeef

文字列の場合、これは機能します

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

Stringsを並べ替えているだけですか?その場合、ラムダは不要です。意味がありません。あなたはただやる

import static Java.util.Comparator.*;

list.sort(naturalOrder());

...ただし、Stringフィールドを使用してオブジェクトを並べ替える場合は、多少意味があります。

list.sort(comparing(Foo::getString));
27
Louis Wasserman

list.sort(String::compareToIgnoreCase)を使用します

list.sort(String::compareTo)またはlist.sort(Comparator.naturalOrder())を使用すると、誤った(つまり、アルファベット以外の)結果が得られます。 any大文字の前にall小文字をソートするため、配列["aAAA","Zzz", "zzz"]["Zzz", "aAAA", "zzz"]にソートされます。

5
UTF_or_Death

アルファベット順に並べ替える名前のリスト(文字列)があるとします。

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

その完璧な動作。

4
Sai prateek

本当に一般的な解決策は、次のような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));
1
Chris311

最も簡潔:

Collections.sort(stringList, String::compareToIgnoreCase);
0
Faraz Durrani

関数型プログラミングでは、古いオブジェクトを操作するのではなく、新しいオブジェクトを次のように作成します。

list.stream().sorted().map(blah-blah).filter(...)...
0
Dmitry Ginzburg