Java のダブルコロン演算子(::)

Joel Swapnil Singh 2023年10月12日
  1. Java でダブルコロン(::)演算子を使用する場合と方法
  2. まとめ
Java のダブルコロン演算子(::)

Java では、二重コロン演算子(::)を使用して、クラス名を使用してメソッドを参照することにより、メソッドを呼び出すことができます。

ラムダ式を使用してこれを行うこともできます。ここで見つかった唯一の違いは、::演算子を使用しながら、名前でメソッドを直接参照できることです。

一方、ラムダ式を使用する場合は、呼び出す必要のあるメソッドへのデリゲートが必要です。この記事では、Java での::演算子の使用について説明します。

Java で::演算子を使用できる場所はさまざまです。メソッドを参照するために::演算子を使用できます。

したがって、::を使用してクラスまたはオブジェクトから静的メソッドを抽出できます。コンストラクターには::演算子を使用することもできます。

また、入力ストリームが与えられたら、::演算子を使用して入力ストリームの要素を出力できます。

Java でダブルコロン(::)演算子を使用する場合と方法

静的メソッド、インスタンスメソッド、スーパーメソッド、特定のタイプの任意のオブジェクトのインスタンスメソッド、さらにはクラスコンストラクターを処理するときに、::演算子を使用できます。

それぞれのアプローチについて 1つずつ説明していきましょう。

静的メソッドを処理している間

静的メソッドを処理する場合、Java で::演算子を使用できます。クラスの静的メソッドへの参照を取得するには、最初にクラス名を記述し、次に::演算子を記述してから、メソッド名を記述します。

このアプローチの構文を見てみましょう。

構文:

(ClassName::methodName)

それがどのように機能するかを理解するために、以下のコードを見てみましょう。

import java.util.*;
public class Main {
  static void staticFunction(String s) // static function which is called using::operator
  {
    System.out.println(s);
  }
  public static void main(String args[]) {
    List<String> list = new ArrayList<String>();
    list.add("This");
    list.add("is");
    list.add("an");
    list.add("example");
    list.forEach(Main::staticFunction);
  }
}

出力:

This
is
an
example

インスタンスメソッドを処理している間

インスタンスメソッドを処理するときに、Java で::演算子を使用することもできます。

クラスのインスタンスメソッドへの参照を取得するには、最初にクラスのオブジェクトを記述します。次に、::演算子を入力し、最後にメソッド名を記述します。

このアプローチの構文を見てみましょう。

構文:

(ObjectOfTheClass::methodName)

それがどのように機能するかを理解するために、以下のコードを見てみましょう。

import java.util.*;
public class Main {
  void instanceFunction(String s) // function which is called using::operator
  {
    System.out.println(s);
  }
  public static void main(String args[]) {
    List<String> list = new ArrayList<String>();
    list.add("This");
    list.add("is");
    list.add("an");
    list.add("example");
    Main object = new Main();
    list.forEach(object::instanceFunction);
  }
}

出力:

This
is
an
example

スーパーメソッドを扱っている間

スーパーメソッドを処理するときに、Java で::演算子を使用することもできます。

クラスのスーパーメソッドを参照するには、最初にキーワード super を記述します。次に、::演算子を入力し、最後にメソッド名を記述します。

このアプローチの構文を見てみましょう。

構文:

(super::methodName)

それがどのように機能するかを理解するために、以下のコードを見てみましょう。

// Java code to show use of double colon operator for super methods
import java.util.*;
import java.util.function.*;
class SuperClass {
  // super function to be called
  String printFunction(String s) {
    return ("This is Print function output from the SuperClass: " + s);
  }
}
public class Main extends SuperClass {
  // instance method to override super method
  @Override
  String printFunction(String s) {
    // call the super method
    // using double colon operator
    Function<String, String> func = super::printFunction;
    String newValue = func.apply(s);
    System.out.println(newValue);
    return newValue;
  }
  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("This");
    list.add("is");
    list.add("an");
    list.add("example");
    Main object = new Main();
    list.forEach(object::printFunction);
  }
}

出力:

This is Print function output from the SuperClass: This
This is Print function output from the SuperClass: is
This is Print function output from the SuperClass: an
This is Print function output from the SuperClass: example

特定のタイプの任意のオブジェクトのインスタンスメソッドを処理している間

特定のタイプの任意のオブジェクトのインスタンスメソッドを処理するときに、Java で::演算子を使用することもできます。

特定のタイプの任意のオブジェクトのインスタンスメソッドを参照するために、最初にクラス名を記述します。次に、::演算子を入力し、最後にメソッド名を記述します。

このアプローチの構文を見てみましょう。

構文:

(ClassName::methodName)

それがどのように機能するかを理解するために、以下のコードを見てみましょう。

// Java code to show the use of double colon operator for instance method of arbitrary type
import java.util.*;
class Test {
  String s = null;
  Test(String s) {
    this.s = s;
  }
  // instance function to be called
  void instanceFunction() {
    System.out.println(this.s);
  }
}

public class Main {
  public static void main(String[] args) {
    List<Test> list = new ArrayList<Test>();
    list.add(new Test("This"));
    list.add(new Test("is"));
    list.add(new Test("an"));
    list.add(new Test("example"));
    list.forEach(Test::instanceFunction); // call the instance method using double colon operator
  }
}

出力:

This
is
an
example

クラスコンストラクターを扱っている間

クラスコンストラクターを処理するときに、Java で::演算子を使用することもできます。

クラスコンストラクターへの参照を取得するには、最初にクラスの名前を記述します。次に、::演算子を配置し、最後に、その特定のクラスのコンストラクターを呼び出す new を記述します。

このアプローチの構文を見てみましょう。

構文:

(ClassName::new)

それがどのように機能するかを理解するために、以下のコードを見てみましょう。

// Java code to show the use of double colon operator for class constructor
import java.util.*;
public class Main {
  public Main(String s) {
    System.out.println(s);
  }
  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("This");
    list.add("is");
    list.add("an");
    list.add("example");
    list.forEach(Main::new); // call the instance method using double colon operator
  }
}

出力:

This
is
an
example

まとめ

この記事では、5つの場所を調べ、Java で二重コロン演算子(::)を使用しました。

すべての手法にはそれぞれの意味があり、上記の状況のいずれかに遭遇したときはいつでも::演算子を適用できます。不適切な使用は誤った状況を引き起こす可能性があるため、構文には注意してください。

関連記事 - Java Operator