static メソッド参照
static メソッドを呼び出すラムダを ClassName::methodName 形式の参照に置き換えます。
「static メソッド参照」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
メソッド参照とは
メソッド参照は、既存のメソッドに処理を委譲するラムダ式の省略形です。ラムダ式が単一のメソッドを呼び出すだけの場合、メソッド参照のほうが簡潔で読みやすくなります。
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice", "Bob", "Carol");
// Lambda:
names.forEach(s -> System.out.println(s));
// Equivalent method reference:
names.forEach(System.out::println);staticメソッド参照の構文
staticメソッド参照はClassName::staticMethodNameという形式です。同じシグネチャのメソッドを期待する関数型インターフェースがあれば、どこでも使用できます。
import java.util.stream.*;
// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
.map(Integer::parseInt) // replaces s -> Integer.parseInt(s)
.collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]メソッド参照としてのMath.abs
Mathのようなユーティリティクラスのstaticメソッドは、直接参照できます:
import java.util.*;
import java.util.stream.*;
List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
.map(Math::abs) // replaces v -> Math.abs(v)
.collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]Predicateを使用したstaticメソッド参照
booleanを返すstaticメソッドは、Predicateとして使用できます:
import java.util.stream.*;
// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
.filter(Objects::isNull)
.count();
System.out.println(nullCount); // 2
long nonNull = mixed.stream()
.filter(Objects::nonNull)
.count();
System.out.println(nonNull); // 2Comparatorのstatic参照
Comparatorに一致するstaticメソッドも参照できます:
import java.util.*;
import java.util.stream.*;
List<String> words = List.of("banana", "apple", "cherry");
// String.CASE_INSENSITIVE_ORDER is a Comparator
List<String> sorted = words.stream()
.sorted(String::compareToIgnoreCase)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]カスタムstaticヘルパーメソッド
staticユーティリティメソッドを定義し、直接参照します:
class Validator {
static boolean isPositive(int n) { return n > 0; }
static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}
List<Integer> nums = List.of(-2, 3, -1, 5, 0);
List<Integer> positive = nums.stream()
.filter(Validator::isPositive)
.collect(Collectors.toList());
System.out.println(positive); // [3, 5]
List<String> labels = nums.stream()
.map(Validator::toLabel)
.collect(Collectors.toList());staticメソッドを使用したBiFunction
2つのパラメーターを受け取るstaticメソッドは、BiFunction<T,U,R>に一致させることができます:
import java.util.function.*;
// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7
// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30Comparator.comparing + static参照によるソート
Comparator.comparingとメソッド参照を組み合わせると、簡潔にソートできます:
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);
people.stream()
.sorted(Comparator.comparing(Person::name))
.forEach(p -> System.out.println(p.name()));
// Alice, Bob, Charliestaticメソッド参照を使用する場面
次の条件に当てはまる場合は、staticメソッド参照を使用します:
- ラムダ式の本体が単一のstaticメソッド呼び出しである
- 引数の変換が必要ない
- メソッドのシグネチャが関数型インターフェースに一致する
引数の変換や追加のロジックが必要な場合は、ラムダ式を使用してください。
可読性の比較
ラムダ式とメソッド参照のスタイルを並べて比較します:
// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));
// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);よくある落とし穴: シグネチャの不一致
メソッド参照は、そのシグネチャが関数型インターフェースの抽象メソッドと完全に一致する場合にだけ機能します。引数の型や数が異なる場合は、代わりにラムダ式でラップしてください。
// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR
// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0理解度チェック
次のうち、Predicate<Object>として機能する有効なstaticメソッド参照はどれですか?
復習: staticメソッド参照
重要なポイント:
- 構文: ClassName::staticMethodName
- 単一のstaticメソッドに処理を委譲するラムダ式を置き換えます
- メソッドのシグネチャは、関数型インターフェースの抽象メソッドと一致していなければなりません
- Predicate、Function、Consumer、Comparatorなどで使用できます
- 引数の変換や追加のロジックが必要な場合は、ラムダ式を使用します
よくある質問
「static メソッド参照」レッスンは無料ですか?
はい。「static メソッド参照」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「static メソッド参照」で何を学びますか?
static メソッドを呼び出すラムダを ClassName::methodName 形式の参照に置き換えます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「static メソッド参照」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- static メソッド参照
- 特定のインスタンスのインスタンスメソッド参照
- 任意のインスタンスメソッド参照
- コンストラクター参照