0Pricing
Java Academy · レッスン

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); // 2

Comparatorの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)); // 30

Comparator.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, Charlie

staticメソッド参照を使用する場面

次の条件に当てはまる場合は、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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. static メソッド参照
  2. 特定のインスタンスのインスタンスメソッド参照
  3. 任意のインスタンスメソッド参照
  4. コンストラクター参照
← Java Academyに戻る