sorted
メソッドは、中間操作の一つで、ストリーム内の要素を昇順/降順/任意の順に並び替えることができます。
昇順に並び替えたい場合は、単にsorted()
を実行するだけでOKです。
Java
Arrays.asList(200,8,500,300,2000,100,400,50).stream()
.sorted()
.forEach(System.out::println);
実行結果
8
50
100
200
300
400
500
2000
また、以下のように.sorted(Comparator.naturalOrder())
を指定しても上記と同じ結果を得ることができます。
Java
Arrays.asList(200,8,500,300,2000,100,400,50).stream()
.sorted(Comparator.naturalOrder())
.forEach(System.out::println);
降順に並び替えたい場合は.sorted(Comparator.reverseOrder())
を指定して実行します。
Java
Arrays.asList(200,8,500,300,2000,100,400,50).stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println);
実行結果
2000
500
400
300
200
100
50
8
複数の項目でソートしたい場合は、以下のように連結して指定します。
Java
Comparator.comparing(column1).thenComparing(column2).thenComparing(column3);
今回は、以下のCEOクラスのデータをソートします。
Java
public class CEO {
private int age; //年齢
private int birthDay; //誕生日
private String name; //名前
//コンストラクタ
public CEO(int age, int birthDay, String name) {
this.age = age;
this.birthDay = birthDay;
this.name = name;
}
//ゲッター・セッター
public int getAge() { return age;}
public void setAge(int age) { this.age = age;}
public int getBirthDay() { return birthDay;}
public void setBirthDay(int birthDay) {this.birthDay = birthDay;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
@Override
public String toString(){
return this.age + ":" + this.birthDay + ":" + this.name;
}
}
以下は、年齢(降順)、生年月日(降順)、名前(昇順)でソートして出力してみました。降順で並び替えたい項目には.reversed()
を指定しています。
Java
//CEOリストの生成
List<CEO> CEOList = new ArrayList<>();
//CEOリストにデータを詰める。
CEOList.add(new CEO(47, 19721029, "Horiemon"));
CEOList.add(new CEO(59, 19601101, "Tim Cook"));
CEOList.add(new CEO(47, 19730326, "Larry Page"));
CEOList.add(new CEO(48, 19720610, "Sundar Pichai"));
CEOList.add(new CEO(36, 19840514, "Mark Zuckerberg"));
CEOList.add(new CEO(49, 19710628, "Elon Musk"));
CEOList.add(new CEO(56, 19640112, "Jeffrey Bezos"));
CEOList.stream()
//年齢の降順かつ、誕生日の降順に並び替える。
.sorted(Comparator.comparing(CEO::getAge).reversed()
.thenComparing(Comparator.comparing(CEO::getBirthDay).reversed()))
.collect(Collectors.toList())
.forEach(System.out::println);
実行結果
59:19601101:Tim Cook
56:19640112:Jeffrey Bezos
49:19710628:Elon Musk
48:19720610:Sundar Pichai
47:19730326:Larry Page
47:19721029:Horiemon
36:19840514:Mark Zuckerberg
ラリー・ペイジとホリエモンは同い年なので、誕生日が後ろのラリー・ペイジが上に来ます。
また、以下のように処理を分離して記述することも可能です。
Java
//年齢の降順かつ、誕生日の降順に並び替える。
Comparator<CEO> comparator = Comparator.comparing(CEO::getAge).reversed()
.thenComparing(Comparator.comparing(CEO::getBirthDay).reversed());
CEOList.stream()
.sorted(comparator)
.collect(Collectors.toList())
.forEach(System.out::println);
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!