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

Java 9でOptionalクラスからStreamを取得する方法をわかりやすく解説

Optionalクラスとは

Optionalクラスは、null以外の値を保持するかもしれないし、保持しないかもしれないコンテナ(入れ物)を提供するクラスです。Java 8で導入され、コード中でNullPointerExceptionが発生する箇所を減らすことを目的としています。

さらにJava 9では、Optionalをより便利に扱うための3つのメソッドが追加されました。

  • ifPresentOrElse():値が存在する場合と存在しない場合の処理を1か所にまとめて記述できる
  • or():値が存在しない場合に、別のOptionalを返す(デフォルト値の指定に便利)
  • stream():OptionalをStreamに変換する

stream()メソッドでOptionalからStreamを取得する

Java 9で追加されたstream()メソッドを使うと、Optionalの中身をそのままStream APIの操作に渡せるようになります。値が存在すれば要素1つのStreamを、空のOptionalであれば空のStreamを返すため、nullチェックの分岐を書くことなく、mapやfilterなどの処理へスムーズにつなげられるのが大きなメリットです。

以下の例では、Personクラスを使って、OptionalからStreamを取得する方法を示しています。

サンプルコード

import java.util.Optional;
import java.util.stream.Stream;

public class OptionalTest {
    public static void main(String args[]) {
        // 値が存在するOptionalからStreamを取得
        getPerson().stream()
                   .map(Person::getName)
                   .map("Jai "::concat)
                   .forEach(System.out::println);

        // 空のOptionalからStreamを取得
        getEmptyPerson().stream()
                        .map(Person::getName)
                        .map("Jai "::concat)
                        .forEach(System.out::println);
    }
    private static Optional<Person> getEmptyPerson() {
        return Optional.empty();
    }
    private static Optional<Person> getPerson() {
        return Optional.of(new Person("Adithya"));
    }
    static class Person {
        private String name;
        public Person(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

実行結果

Jai Adithya

コードの解説

getPerson()は「Adithya」という名前のPersonオブジェクトを保持するOptionalを返します。このOptionalに対してstream()を呼び出すと、要素が1つだけ含まれたStreamが生成され、名前の取得(map(Person::getName))や文字列の連結(map("Jai "::concat))を経て、「Jai Adithya」が出力されます。

一方、getEmptyPerson()Optional.empty()、つまり空のOptionalを返します。空のOptionalに対してstream()を呼び出すと空のStreamが返されるため、後続のmap処理は一切実行されず、何も出力されません。

このように、stream()メソッドを利用することで、値の有無を意識せずにStream APIのパイプラインへ統合でき、nullチェックのためのif文を減らして、より簡潔で安全なコードを書くことができます。

  1. Javaでフォルダ内のディレクトリ(フォルダ)のみを取得する方法

    Javaで特定のフォルダに含まれるファイルではなく、ディレクトリ(サブフォルダ)だけを取得したいケースはよくあります。本記事では、代表的な2つの方法——FileFilterインターフェースを使う方法と、NIOのFiles.walk()を使う方法——をサンプルコード付きで解説します。listFiles()メソッドとFileFilterの基本FileクラスのlistFiles()メソッドは、そのFileオブジェクトが表すパスに含まれるすべてのファイルおよびディレクトリの抽象パス名を、配列として返します。ここで活躍するのがFileFilterインターフェースです。FileFilterはパス名をフィル

  2. VLCからChromecastへメディアをストリーミングする方法【手順を解説】

    Chromecastが登場して以来、多くのユーザーがVLCによる対応を待ち望んでいました。そしてついに、バージョン3.0からChromecastへのキャスト機能が正式にサポートされるようになりました。最新版VLCを入手する現時点では、VLC公式サイトからアプリを手動でダウンロードしてアップデートする必要があります。注意点として、VLC内蔵の「アップデートを確認」機能では、バージョン3.0が最新版として認識されない場合があります。Chromecastへのキャスト手順最新版をインストールしたら、以下の手順でChromecastにメディアをストリーミングできます。VLCで再生したいメディアファイルを