Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9で追加されたOptional.stream()メソッドとは?使い方を実例付きで解説

Java 9では、Optionalクラスにstream()メソッドが新たに追加され、機能が大幅に強化されました。このメソッドを使うことで、「Optional要素のStream」を「実際に値が存在する要素だけのStream」へ簡単に変換できます。

具体的な動作は以下の通りです。

  • Optionalが値を保持している場合 → その値を1つだけ含むStreamを返す
  • Optionalが空(empty)の場合 → 空のStreamを返す

これにより、これまでJava 8で必要だった冗長な条件分岐や三項演算子を使わずに、簡潔で読みやすいコードを書けるようになりました。

構文

public Stream<T> stream()

使用例

以下のサンプルコードでは、Java 8での従来の書き方と、Java 9のstream()メソッドを使った書き方を比較しています。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamMethodTest {
    public static void main(String[] args) {
        List<Optional<String>> list = Arrays.asList(
                Optional.empty(),
                Optional.of("TutorialsPoint"),
                Optional.empty(),
                Optional.of("Tutorix"));

        // 【Java 8の書き方】Optionalが非空なら値をStreamに流し、空なら空のStreamを返す
        List<String> filteredListJava8 = list.stream()
                .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
                .collect(Collectors.toList());

        // 【Java 9の書き方】Optional::streamは、値があれば1要素のStream、なければ0要素のStreamを返す
        List<String> filteredListJava9 = list.stream()
                .flatMap(Optional::stream)
                .collect(Collectors.toList());

        System.out.println(filteredListJava8);
        System.out.println(filteredListJava9);
    }
}

実行結果

[TutorialsPoint, Tutorix]
[TutorialsPoint, Tutorix]

実行結果を見ると、どちらの書き方でも同じ出力になっていることが分かります。しかし、Java 9のOptional::streamをメソッド参照として使う方法の方が、コードが短く、意図も明確になります。空のOptionalを自動的に除外してくれるため、nullチェックや条件分岐を自分で書く必要がなく、ストリーム処理全体の可読性と保守性が向上するのが大きなメリットです。

  1. Javaのpack()メソッドとは?使い方とsetSize()との違いを解説

    pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の

  2. JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説

    JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ