Javaのcountの使い方を完全ガイド!ラムダ式で件数カウントの定石をマスターしよう
生徒
「Javaのラムダ式で、条件に合うデータの件数を数える方法ってありますか?」
先生
「ありますよ。Streamのcount()メソッドを使えば、フィルターをかけた後の件数を簡単にカウントできます。」
生徒
「なるほど!条件付きの件数カウントも簡単にできるんですね!」
先生
「はい、それではcount()の使い方を順番に見ていきましょう!」
1. countメソッドとは?JavaのStreamで件数を数える基本
Javaのcount()メソッドは、Stream内の要素数を取得するための便利なメソッドです。通常のforループを使わず、ラムダ式だけで簡潔に件数を数えることができ、条件に合致する要素だけをカウントすることも可能です。
例えば、整数リストの中で偶数の数を数える場合、以下のように書けます。
import java.util.Arrays;
import java.util.List;
public class CountBasicExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
long evenCount = numbers.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println("偶数の数: " + evenCount);
}
}
このサンプルでは、filterで偶数だけを抽出し、count()でその件数を取得しています。初心者でも直感的に理解できるシンプルな書き方で、データの件数を素早く取得できるのが特徴です。
2. ラムダ式とcountの基本的な使い方
まずは基本形として、数値のリストの中で偶数の数を数える例を見てみましょう。
import java.util.Arrays;
import java.util.List;
public class CountExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
long count = numbers.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println("偶数の数: " + count);
}
}
この例では、filterで偶数だけを抽出し、count()でその件数を取得しています。
3. 条件付きで文字列をカウントする
Stringのリストから、特定の条件に合うデータだけを数えたい場合も、ラムダ式+count()で非常に簡単に書けます。
import java.util.Arrays;
import java.util.List;
public class StringCountExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("佐藤", "田中", "鈴木", "佐々木", "斉藤");
long count = names.stream()
.filter(name -> name.startsWith("佐"))
.count();
System.out.println("佐で始まる名前の数: " + count);
}
}
文字列のパターンマッチにも柔軟に対応できます。
4. Listが空かどうかを判定するcountの活用
count()を使うことで、Streamの中身が空かどうかのチェックも簡単に行えます。0件かどうかを判定するロジックに活用できます。
List<String> items = new ArrayList<>();
boolean isEmpty = items.stream().count() == 0;
シンプルにcount() == 0で空判定が可能になります。
5. distinctと組み合わせて重複を除いてカウント
distinct()メソッドと組み合わせれば、重複のない件数を取得できます。ユニークな要素数だけを知りたいときに便利です。
import java.util.Arrays;
import java.util.List;
public class DistinctCountExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("りんご", "バナナ", "りんご", "みかん");
long uniqueCount = fruits.stream()
.distinct()
.count();
System.out.println("重複なしの果物の種類数: " + uniqueCount);
}
}
distinct()を使うことで、同じ要素が何回出現しても1つと見なしてカウントします。
6. groupingByとcountingの組み合わせで件数集計
Collectors.groupingByとCollectors.counting()を組み合わせれば、カテゴリごとの件数集計も可能です。
import java.util.*;
import java.util.stream.*;
public class GroupCountExample {
public static void main(String[] args) {
List<String> items = Arrays.asList("果物", "野菜", "果物", "果物", "野菜");
Map<String, Long> result = items.stream()
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
result.forEach((k, v) -> System.out.println(k + ": " + v + "件"));
}
}
このように、分類+カウントの処理もラムダ式でスッキリ書けます。
7. countの注意点:終端操作であることに注意
count()はStreamの終端操作(ターミナルオペレーション)なので、1回しか呼び出せません。2回以上使いたい場合は、collect()でリスト化して再度処理するか、peek()で中身を確認する工夫が必要です。
8. ラムダ式とcountを使いこなして可読性を高めよう
従来のforループによるカウント処理と比較して、ラムダ式+count()はコードが短く、意図も明確になります。可読性が高まり、メンテナンス性も良くなるので、積極的に使っていきましょう。
JavaのStream APIやラムダ式は、初めは難しく感じるかもしれませんが、filterやcountなどの基本操作に慣れることで、業務でも効率的にデータ処理ができるようになります。
まとめ
Javaのcountメソッドとラムダ式を組み合わせたデータ件数カウント処理は、Stream APIを活用したプログラミングにおいて非常に重要な技術であり、条件付きカウント、文字列のパターンマッチを用いた件数取得、distinctによる重複排除カウント、groupingByとcountingの組み合わせによるカテゴリ別集計など、多くの場面で応用できます。特に業務システムでは、データ件数の確認、条件一致数のチェック、リストが空かどうかの判定、ログデータの集計、売上データのカテゴリ別集約など、多種多様な場面でcountを使用することが一般的です。
Streamのcountメソッドは終端操作であるため1度しか使用できない点、filterやdistinctなどの中間処理と組み合わせることで柔軟な集計が可能になる点、条件をラムダ式で直感的に記述できる点など、特性を正しく理解しておくことで、より強力で読みやすいコードを実現できます。また、従来のfor文や変数を使った件数カウントよりも明確で意図が分かりやすい記述が可能なため、大規模プロジェクトでも品質の高いコードを維持しやすくなります。
さらに、distinctと組み合わせることでユニーク要素のカウントができたり、groupingBy+countingでカテゴリ別の件数を一括集計できるなど、JavaのStream APIならではの強力な集約処理も魅力のひとつです。データ分析やレポート生成の前処理としても大いに役立ち、ラムダ式を自然に使いこなせるようになると、データ加工から集約処理まで一連のフローをすっきりと記述できるようになります。
また、countメソッドは0件チェックにも使えるため、nullチェックや「リストが空かどうか」の判定を簡潔に表現できるのも大きなメリットです。アプリケーション開発においてデータの件数判定は頻繁に行われる処理であり、その場面で毎回ループを書く必要がなくなることで生産性が大幅に向上します。初心者の段階からcountを正しく理解しておくことは、後の実務にも大きく影響します。
以下では、記事内容のポイントを踏まえつつ、countメソッドの実践的な使い方をまとめたサンプルを掲載しています。コード構造は記事の内容と統一しつつ、件数カウントのバリエーションを再確認できるように構成しています。
countを活用したサンプルプログラムまとめ
Stream APIとラムダ式を組み合わせた、代表的な件数カウント処理を以下にまとめます。
import java.util.*;
import java.util.stream.*;
public class CountSummaryExample {
public static void main(String[] args) {
// 偶数の数をカウント
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);
long even = nums.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println("偶数の件数:" + even);
// 「佐」で始まる名前の件数
List<String> names = Arrays.asList("佐藤", "田中", "佐々木", "鈴木", "斉藤");
long saCount = names.stream()
.filter(s -> s.startsWith("佐"))
.count();
System.out.println("佐で始まる件数:" + saCount);
// 重複なしの件数(distinct)
List<String> fruits = Arrays.asList("りんご", "バナナ", "りんご", "みかん");
long unique = fruits.stream()
.distinct()
.count();
System.out.println("ユニーク件数:" + unique);
// カテゴリごとの件数集計
List<String> categories = Arrays.asList("果物", "野菜", "果物", "果物", "野菜");
Map<String, Long> group = categories.stream()
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
group.forEach((k, v) -> System.out.println(k + ":" + v + "件"));
// 空判定にcountを活用
List<String> emptyList = new ArrayList<>();
boolean isEmpty = emptyList.stream().count() == 0;
System.out.println("空リストか:" + isEmpty);
}
}
このサンプルを実際に動かしてみることで、countの基本的な動作、filterによる条件付きカウント、distinctによる重複排除、groupingByによる分類集計などをまとめて学ぶことができます。データ件数を正確に把握する処理は幅広い場面で必ず必要になるため、countメソッドの特徴と活用場面をしっかり押さえておくことが重要です。
生徒:「countってただ数を取るだけだと思っていましたが、条件付きカウントやdistinctとの組み合わせなど幅広く使えるんですね。」
先生:「そうなんです。ラムダ式を使えば、どんな条件にも柔軟に対応できるのがStream APIの強みです。」
生徒:「groupingByと一緒に使うと、カテゴリ別の件数集計も簡単にできるのはすごく便利だと感じました。」
先生:「分類と件数カウントはよく使う処理なので、覚えておくと実務でも役立ちますよ。」
生徒:「distinctで重複を除いた件数が取れるのも便利ですね。ユニーク数を調べたい場面って結構ありますよね。」
先生:「その通りです。データ分析やレポート作成の前処理にもよく使われます。」
生徒:「countが終端操作で一度しか使えないという点も重要ですね。ストリームを再利用したいときの注意点として覚えておきます。」
先生:「はい、そこは実務でミスしがちなポイントなので注意が必要ですね。」
生徒:「今日学んだ内容を使って、自分のアプリケーションでもデータのカウント処理を効率良く書けるようになりたいです。」
先生:「ぜひ活用してください。countを理解するとデータ処理の幅が一気に広がりますよ。」