3. プリミティブ特化型 (41-70)
プリミティブ特化型のインターフェースは、Java Gold試験において**「最もひっかけ問題が作りやすい」**鬼門です。
通常、List<Integer> などを使うと「オートボクシング(int ↔ Integer の変換)」が発生し、大量のデータを扱う際に動作が重くなります。それを避けるために用意されたのが、これらのプリミティブ(int, long, double, boolean)専用のインターフェースです。
41番から70番まで、全項目を整理して解説します。
41-43. 基本のプリミティブ版 (Predicate, Consumer, Supplier)¶
これらは非常にシンプルです。型名の前に Int, Long, Double が付きます。
Java
// 41. IntPredicate: intを受け取り、booleanを返す
IntPredicate isPositive = n -> n > 0;
// 42. DoubleConsumer: doubleを受け取り、void(消費)
DoubleConsumer printDouble = d -> System.out.println(d);
// 43. IntSupplier: 引数なし、intを返す
IntSupplier dice = () -> (int)(Math.random() * 6) + 1;
// 注意:抽象メソッド名は getAsInt() です(get() ではない)
int val = dice.getAsInt();
44-47. Functionの「方向」に注意 (重要!)¶
試験で最も狙われるのが、**「引数がプリミティブなのか、戻り値がプリミティブなのか」**の区別です。
XxxFunction<R>: 引数がプリミティブXxx、戻り値が参照型RToXxxFunction<T>: 引数が参照型T、戻り値がプリミティブXxx
Java
// 44. IntFunction<R>: intを受け取って R(String) を返す
IntFunction<String> itos = i -> "Value is " + i;
// 45. ToIntFunction<T>: T(String) を受け取って int を返す
ToIntFunction<String> stoi = s -> s.length();
// 46-47. プリミティブ間の変換
IntToDoubleFunction iToD = i -> i * 1.0; // int -> double
IntToLongFunction iToL = i -> (long)i; // int -> long
48-49. 特殊なバリエーション¶
- **48.
ObjXxxConsumer<T>**:BiConsumerの変種です。一つはオブジェクト、もう一つはプリミティブを受け取ります。 - **49.
BooleanSupplier**: 引数なしでbooleanを返します。
Java
// 48. ObjIntConsumer<T>: オブジェクト(T)とintを受け取る
ObjIntConsumer<List<String>> listAdder = (list, i) -> list.add(String.valueOf(i));
// 49. BooleanSupplier: () -> boolean
BooleanSupplier coinFlip = () -> Math.random() > 0.5;
// 抽象メソッド名は getAsBoolean()
51-54. 抽象メソッド名のまとめ¶
プリミティブ版は、メソッド名に AsXxx が付くことが多いです。
| インターフェース | 抽象メソッド名 |
|---|---|
IntPredicate |
test(int value) (変わらず) |
IntConsumer |
accept(int value) (変わらず) |
IntSupplier |
getAsInt() |
IntFunction |
apply(int value) |
ToIntFunction |
applyAsInt(T value) |
IntUnaryOperator |
applyAsInt(int operand) |
50, 55-70. プリミティブUnary/BinaryOperatorと特徴¶
Java
// 55. IntUnaryOperator: intを受け取りintを返す
IntUnaryOperator doubleIt = n -> n * 2;
// 56. IntBinaryOperator: intを2つ受け取りintを返す
IntBinaryOperator sum = (a, b) -> a + b;
💡 Java Gold 試験対策の「ひっかけ」徹底攻略¶
Predicateにプリミティブ版の戻り値名はない:IntPredicateのメソッドはgetAsBoolean()ではなく、普通のtest()です。混乱しやすいので注意。LongFunction<Double>とToDoubleFunction<Long>の違い:- 前者は
longを引数に取ります(apply(long))。 -
後者は
Long(オブジェクト)を引数に取ります(applyAsDouble(Long))。 -
Streamのメソッドとの対応: Stream<Integer>.mapToInt(i -> i)に渡すのはToIntFunctionです。IntStream.mapToObj(i -> "ID:" + i)に渡すのはIntFunctionです。
これでプリミティブ特化型の全容が見えました。
次は、これらを実際の List や Map のメソッド、さらには Optional でどう使いこなすかという 「4. 応用と試験のひっかけ (71-100)」 に進みますか?それとも、プリミティブ版の名称当てクイズを数問やってみますか?
なお、各種アプリのすべての機能を使用するには、Gemini アプリ アクティビティを有効にする必要があります。