誰かが新しいラムダ構文を使用してJava 8でArrayList
をアルファベット順にソートする方法の簡単な例を教えてもらえますか?.
文字列の場合、これは機能します
arrayList.sort((p1, p2) -> p1.compareTo(p2));
String
sを並べ替えているだけですか?その場合、ラムダは不要です。意味がありません。あなたはただやる
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())
を使用すると、誤った(つまり、アルファベット以外の)結果が得られます。 any大文字の前にall小文字をソートするため、配列["aAAA","Zzz", "zzz"]
は["Zzz", "aAAA", "zzz"]
にソートされます。
アルファベット順に並べ替える名前のリスト(文字列)があるとします。
List<String> result = names.stream().sorted(
Comparator.comparing(n->n.toString())).collect(Collectors.toList());
その完璧な動作。
本当に一般的な解決策は、次のような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));
最も簡潔:
Collections.sort(stringList, String::compareToIgnoreCase);
関数型プログラミングでは、古いオブジェクトを操作するのではなく、新しいオブジェクトを次のように作成します。
list.stream().sorted().map(blah-blah).filter(...)...