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チェックや条件分岐を自分で書く必要がなく、ストリーム処理全体の可読性と保守性が向上するのが大きなメリットです。
-
Javaのpack()メソッドとは?使い方とsetSize()との違いを解説
pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ