1. -1, 2, -3, 4, 5 の中で正の数は 2, 4, 5 の 3 個
  2. 空配列なら 0
  3. 0 だけの配列なら 0 (0 は正の数ではない)
  4. 全て負の数なら 0
  5. 全て正の数なら配列長と同じ
  6. 0 と正の数が混ざる場合は正の数だけ数える
コース一覧
Java 中級:コレクション・Stream・例外処理
Predicate インターフェース

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

Predicate インターフェース

if に書いた条件は、その場所から動かせない

「このタグは有効か」という判定を、登録画面と一覧画面と集計処理の 3 か所で書いたとします。中身は同じ条件式なのに、if の中に直接書いてあるので共有できません。仕様が変わると 3 か所を探して直すことになり、1 か所直し忘れて挙動がずれる、というのがよくある事故です。

条件そのものを変数に入れて持ち回せれば、直す場所は 1 か所で済みます。そのための型が java.util.function.Predicate<T> です。

条件を変数に入れて、test で判定する

Predicate<T> は「T を 1 つ受け取って true か false を返す」という意味の型です。動かす命令は test の 1 つだけで、戻り値は必ず boolean です。

Java

import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; public class Demo { public static void main(String[] args) { Predicate<String> isBlank = s -> s.isBlank(); System.out.println(isBlank.test("java")); // false System.out.println(isBlank.test(" ")); // true List<String> tags = new ArrayList<>(List.of("java", " ", "web")); tags.removeIf(isBlank); System.out.println(tags); // [java, web] } }

tags.removeIf(isBlank) のところが大事です。List.removeIf は引数に Predicate を取る作りになっているので、自分で作った条件をそのまま渡せます。Stream の filter も同じです。条件に名前が付くと、読む側は中身を追わなくても何を選んでいるのか分かります。

test が返せるのは boolean だけ

つい「値を返すラムダ」を書いてしまうことがありますが、これはコンパイルエラーになります。

Java

Predicate<Integer> half = n -> n / 2; // エラー、boolean ではない

test の戻り値は boolean に固定されていて、それ以外の型は返せません。値を別の値に変える役目は Function が持っています。

もう 1 つ、Predicate<int> とは書けません。ジェネリクスはプリミティブ型を受け取れないので、整数を判定するならラッパー型の Integer を書きます。

Java

Predicate<Integer> isEven = n -> n % 2 == 0; int size = 4; System.out.println(isEven.test(size)); // true

size は int ですが、test に渡すところでオートボクシングが働くので、呼ぶ側で変換を書く必要はありません。

解説

条件が「1 つ受け取って真偽を返す」形になっているかどうかで判断します。真偽以外を返したくなった時点で、それは Predicate の仕事ではありません。

課題では、判定の条件を Predicate の変数として作り、test を通した結果で数えます。if に条件式を直接書いても数は合いますが、それでは条件を取り出したことにならないので、必ず test を経由させてください。

要件

  1. メソッドの中で Predicate<Integer> isPositive = n -> n > 0; をラムダ式で作ること
  2. 配列の各要素に対して isPositive.test(n) を呼び、true のものだけ数えること (if (n > 0) の直書きはせず、必ず Predicate を経由する)
  3. ファイル先頭で import java.util.function.Predicate; を書くこと

入出力例

positiveCount([-1,2,-3,4,5]) → 3 positiveCount([]) → 0 positiveCount([0]) → 0 positiveCount([-1,-2,-3]) → 0 positiveCount([1,2,3,4]) → 4 positiveCount([0,1,0,2,0,3]) → 3

ヒント

`Predicate<T>` の抽象メソッドは `test(T)` の 1 個だけで、戻り値は `boolean` 固定です。`Predicate<Integer> isPositive = n -> n > 0;` のように書きます

`for (int n : arr)` の `for-each` で回し、`if (isPositive.test(n)) { count++; }` のように数えるのが一番素直な書き方です

`0` は正の数ではないので、`n > 0` であって `n >= 0` ではない点に注意してください

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • Consumer と Supplier

    java.util.function パッケージの代表的な関数型インターフェース Consumer と Supplier の役割と使い分けを学び、List.forEach や Stream.peek での活用までを身につけよう。

  • BiFunction と 2 引数の関数

    2 つの引数を受け取って 1 つの値を返す BiFunction、同じ型同士を扱う BinaryOperator、そして BiPredicate / BiConsumer といった「2 引数版」の関数型インターフェースを整理し、引数が複数あるラムダの書き方を身につけよう。

  • 関数型インターフェース まとめクイズ

    関数型インターフェース (Lambda / メソッド参照 / Function / Predicate / Consumer / Supplier / BiFunction) の総まとめ。代表的な 7 つの関数型インターフェースの違いを 4 択クイズで確認する。

  • String.format で書式化

    `Java` の `String.format` で `%s` `%d` `%,d` `%.2f` などの書式指定子を使い、整形された文字列を組み立てる方法を学ぼう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • 変数データに名前をつけて参照する仕組み
  • 戻り値呼び出し元への返答を表す点線矢印
  • 引数位置引数=順番で渡す。
  • コンパイルソースをバイトコードへ変換する処理
  • ジェネリクス<String> のように型を指定する仕組み
  • プリミティブnumber / string / boolean などの基本型
  • プリミティブ型Javaの基本型(int/double/boolean等)
main.java
学習モード
エディタを読み込んでいます

メモ

Predicate インターフェース

⌘S で保存