【Java】Streamのソート方法(昇順/降順、複数条件、Nullを含む)

当ページのリンクには広告が含まれています。

こんにちは! ログログです。

34歳で開発未経験から開発エンジニアになり、今ではフリーランスエンジニアとして働いています!

JavaのStreamでソートをしたいんだけど、どうやるのかパッとコードが出てこないということはありませんか?

本記事ではStreamでソートする様々なケースを考慮してサンプルを掲載していますのでぜひ参考にして下さい!

目次

ソートのケース

String値

Stringの場合、アルファベットを元にソートすることができます。

降順ソートにしたい場合はsortedの引数にComparator.reverseOrder()を与えます。(昇順/降順を参照)

Int値

intの場合(実際にはIntegerで保持することになりますが)、数値としてソートされます。

昇順/降順

昇順では特に指定する必要はありませんが、明示的にComparator.naturalOrder()を与えることもできます。

降順の場合、Comparator.reverseOrder()をsortedメソッドの引数に与えます。

複数条件

複数条件を指定したい場合、thenComparingを追加していきます。

最初に指定した条件から優先的に適用されるので、以下の例では [ 年齢 > 名前 ] の順でソートされています。

null値を含む

nullが含まれるキーをソートする場合、Comparator.nullsFirst または Comparator.nullsLast を使用する必要があります。

Comparator.nullsFirstはnullが最初になるようにソートし、Comparator.nullsLastは最後になるようにソートします。

使用しなかった場合は NullPinterException がスローされるので注意が必要です。

ソート対象オブジェクトでComparableを実装する

ソート対象のクラスにComparableが実装してあれば、OverrideされたcompareToに従って比較が行われることでソート順が規定されます。

compareToの比較をソート順としたい場合、sortedメソッドに追加の条件は必要はありません。

以下の例では、scoreがcompareToメソッドで比較されています。

Comparatorを指定する

Comparatorを使用することで対象クラスのフィールドでソートすることができます。

以下の例ではscoreの降順でソートしています。

ちなみに、対象クラスにComparableが実装されている場合でも、Comparatorの指定が優先されるので注意してください。

Mapをソートする

Mapのソートではkeyまたはvalueのいずれでソートするかを指定します。

以下の例ではvalueで昇順ソートしていますが、Map.Entry.comparingByKey() を使用することでkeyによるソートが可能です。

まとめ

  • Streamのソートではsortedという中間操作を行う。
  • String、intにおいては単にsortedを指定するだけでよい。
  • 昇順は特に指定不要だが、降順ではComparator.reverseOrder()を指定する。
  • 複数条件の場合、thenComparingで条件を追加していく。
  • nullを含む場合は、Comparator.nullsFirst または Comparator.nullsLastを使用する。
  • ソート対象オブジェクトでComparableを実装されている場合、compareToによる比較が行われる。
  • Comparatorを指定することでソート順を指定できる。その場合、Comparableの実装よりも優先される。
  • Mapのソートではkeyかvalueのいずれでソートするかを指定する。

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次