Javaラムダ式でコレクションをソートする方法|ArrayList・TreeMapの実例付き解説
Java 8から導入されたラムダ式は、Comparatorなどの関数型インターフェースを簡潔に記述できる強力な機能です。本記事では、ラムダ式を活用してArrayListとTreeMapの要素を降順にソートする方法を、実際のコード例と実行結果をもとにわかりやすく解説します。
ラムダ式とは
ラムダ式は、名前を持たない無名関数を短い構文で表現する仕組みです。基本的な書式は次のとおりです。
(引数) -> 式
(引数) -> { 処理; }
従来は匿名クラスで複数行かけて記述していた比較ロジックも、ラムダ式なら1行で書けるため、コレクションのソート処理などで特に効果を発揮します。
ラムダ式でArrayListをソートする
サンプルコード
import java.util.*;
public class Demo {
public static void main(String[] args) {
ArrayList<Integer> my_arr = new ArrayList<Integer>();
my_arr.add(190);
my_arr.add(267);
my_arr.add(12);
my_arr.add(0);
System.out.println("ソート前のリストの要素 : " + my_arr);
Collections.sort(my_arr, (o1, o2) -> (o1 > o2) ? -1 : (o1 < o2) ? 1 : 0);
System.out.println("ソート後のリストの要素 : " + my_arr);
}
}
実行結果
ソート前のリストの要素 : [190, 267, 12, 0] ソート後のリストの要素 : [267, 190, 12, 0]
コードの解説
Demoクラスのmainメソッド内で、まずArrayListを作成し、addメソッドで4つの整数を追加しています。続いてCollections.sortメソッドの第2引数としてラムダ式を渡し、独自の並び順(Comparator)を定義しています。
ラムダ式「(o1, o2) -> (o1 > o2) ? -1 : (o1 < o2) ? 1 : 0」は三項演算子を使っており、第1引数が大きければ-1、小さければ1、等しければ0を返します。この結果、通常の昇順ソートとは逆の降順でリストが並び替えられます。
ラムダ式でTreeMapをソートする
TreeMapはデフォルトではキーの昇順で要素を保持しますが、コンストラクタにComparator(ラムダ式)を渡すことで、任意の順序に変更できます。
サンプルコード
import java.util.*;
public class Demo {
public static void main(String[] args) {
TreeMap<Integer, String> my_treemap =
new TreeMap<Integer, String>((o1, o2) -> (o1 > o2) ? -1 : (o1 < o2) ? 1 : 0);
my_treemap.put(56, "Joe");
my_treemap.put(43, "Bill");
my_treemap.put(21, "Charolette");
my_treemap.put(33, "Jonas");
System.out.println("TreeMapに含まれる要素 : " + my_treemap);
}
}
実行結果
TreeMapに含まれる要素 : {56=Joe, 43=Bill, 33=Jonas, 21=Charolette}
コードの解説
ここでもDemoクラスのmainメソッド内で処理を行っています。ポイントは、TreeMapのインスタンス生成時にコンストラクタへラムダ式を直接渡している点です。これにより、マップはキーの降順で自動的にソートされます。
putメソッドでエントリを追加すると、登録順に関係なくキー値(56 → 43 → 33 → 21)の降順に整列されて格納され、その内容がコンソールに出力されます。
まとめ
ラムダ式を使えば、Comparatorインターフェースを実装した匿名クラスをわざわざ定義することなく、数行のコードで柔軟なソート処理を実現できます。ArrayListのようなList系コレクションにはCollections.sortメソッド、TreeMapのようなSortedMapにはコンストラクタへのComparator渡しがそれぞれ有効です。昇順・降順の切り替えも、ラムダ式内の比較条件を変えるだけで簡単に行えます。
-
EclipseでJavaFXをセットアップする方法|Maven依存関係とJARの手動追加を解説
EclipseでJavaFXアプリケーションを開発するためには、あらかじめ環境構築が必要です。この記事では、Maven依存関係を利用する方法と、必要なJARファイルを手動で追加する方法という2つのアプローチをわかりやすく解説します。事前準備セットアップを始める前に、お使いのシステムにEclipseとJava(JDK)が正常にインストールされていることを確認してください。これらが揃っていれば、どちらの方法でもスムーズにJavaFX環境を構築できます。方法1:Maven依存関係を使ったセットアップMavenを利用してJavaFX環境を構築する場合は、まずEclipseで通常のJavaプロジェクトを
-
Java StreamのfindAny()メソッドの使い方を例付きで解説
Java Stream APIのfindAny()メソッドは、ストリーム内のいずれか1つの要素を返すメソッドです。戻り値はOptional型で、ストリームが空の場合には空のOptionalが返されます。ここでいうOptionalとは、null以外の値を保持している場合と保持していない場合があるコンテナオブジェクトのことです。findAny()は並列処理(parallel stream)との相性が良く、どの要素が返されても問題ない場合に効率的に動作するのが特徴です。基本的な構文Optional<T> result = stream.findAny();例1:整数のリストからfindA