Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Java辞典

  1. トップページ
  2. Java辞典
  3. ラムダ式 / (x) -> x * 2

ラムダ式 / (x) -> x * 2

ラムダ式は関数(メソッド)を簡潔に表現する記法です(Java 8以降)。メソッドを引数として渡したり、関数型インターフェースの実装を1行で書いたりできます。メソッド参照(::)と組み合わせるとさらに簡潔になります。

構文
// ラムダ式の基本構文です。
(引数) -> 式

// 処理が複数行の場合はブロックを使います。
(引数) -> {
    // 複数の処理
    return 値;
}

// 引数が1つの場合は括弧を省略できます。
x -> x * 2

// メソッド参照の種類です。
クラス::staticメソッド        // 例: Integer::parseInt
インスタンス::インスタンスメソッド // 例: str::toUpperCase
クラス::インスタンスメソッド      // 例: String::length
クラス::new(コンストラクタ参照)  // 例: ArrayList::new

// Comparator.comparing() でソートキーを指定します。
list.sort(Comparator.comparing(o -> o.getName()));
list.sort(Comparator.comparing(Person::getName));
主な使用場面一覧
使用場面ラムダ式の例
Runnableの実装() -> System.out.println("実行")
リストのソートlist.sort((a, b) -> a.compareTo(b))
ストリームのfilterstream.filter(x -> x > 0)
ストリームのmapstream.map(x -> x * 2)
forEachの処理list.forEach(s -> System.out.println(s))
メソッド参照(同上)list.forEach(System.out::println)
Comparator.comparing()Comparator.comparing(Person::getName)
サンプルコード
import java.util.*;

// ラムダ式でRunnableを実装します。
Runnable r = () -> System.out.println("スレッドを実行しました。");
new Thread(r).start();

// リストを昇順にソートします。
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
names.sort((a, b) -> a.compareTo(b));
System.out.println(names); // 『[Alice, Bob, Charlie]』と出力されます。

// メソッド参照で同じ処理を書きます。
names.sort(String::compareTo);

// Comparator.comparing() でフィールドを基準にソートします。
List<String> words = new ArrayList<>(List.of("banana", "fig", "apple", "kiwi"));
words.sort(Comparator.comparing(String::length)); // 文字列長でソートします。
System.out.println(words); // 『[fig, kiwi, apple, banana]』と出力されます。

// メソッド参照でforEachを書きます。
List<Integer> nums = List.of(1, 2, 3, 4, 5);
nums.forEach(System.out::println); // 各要素を出力します。

// 独自クラスでComparator.comparing()を使います。
class Person {
    String name; int age;
    Person(String n, int a) { name = n; age = a; }
    String getName() { return name; }
    int getAge() { return age; }
}
List<Person> people = List.of(new Person("Bob", 30), new Person("Alice", 25));
people.stream()
      .sorted(Comparator.comparing(Person::getAge))
      .forEach(p -> System.out.println(p.getName())); // 『Alice』『Bob』の順に出力されます。
概要

ラムダ式は関数型インターフェース(抽象メソッドを1つだけ持つインターフェース)の実装として使われます。匿名クラスに比べて格段に簡潔に書けます。

メソッド参照(::)はラムダ式をさらに短くした記法です。x -> x.toString()Object::toString と同じ意味になります。ラムダ式の中から外部のローカル変数を参照するには、その変数が「実質的にfinal」(変更されない)である必要があります。

主な関数型インターフェースについては『Predicate / Function / Consumer / Supplier』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。