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

Java 9のJShellでストリームの終端操作(ターミナル操作)を活用する方法

JShellは、Java 9から導入された対話型(REPL)ツールです。簡単な文や式などを入力として受け取り、それを評価して、結果を即座にユーザーへ出力します。コードをファイルに保存してコンパイルする必要がないため、APIの動作確認や学習に非常に便利なツールです。

終端操作(Terminal Operation)とは?

終端操作(ターミナル操作)とは、ストリームを入力として受け取る一方で、出力として新しいストリームを返さないストリーム操作のことです。中間操作(filterやmapなど)が別のストリームを返すのに対し、終端操作は最終的な結果を生成します。

例えば、終端操作はラムダ式に適用でき、単一の結果(単一のプリミティブ値やオブジェクト、あるいは単一のオブジェクトのコレクション)を返します。reduce()max()min()などのメソッドは、代表的な終端操作です。

以下のコードスニペットでは、JShell上でさまざまな終端操作であるmin()max()reduce()メソッドを使用する方法を確認できます。

コードスニペット

jshell> IntStream.range(1, 11).reduce(0, (n1, n2) -> n1 + n2);
$1 ==> 55

jshell> List.of(23, 12, 34, 53).stream().max();
|  Error:
|  method max in interface java.util.stream.Stream cannot be applied to given types;
|    required: java.util.Comparator<? super java.lang.Integer>
|    found: no arguments
|    reason: actual and formal argument lists differ in length
|    List.of(23, 12, 34, 53).stream().max();
|    ^----------------------------------^

jshell> List.of(23, 12, 34, 53).stream().max((n1, n2) -> Integer.compare(n1, n2));
$2 ==> Optional[53]

jshell> $2.isPresent()
$3 ==> true

jshell> List.of(23, 12, 34, 53).stream().max((n1, n2) -> Integer.compare(n1, n2)).get();
$4 ==> 53

jshell> List.of(23, 12, 34, 53).stream().filter(e -> e%2==1).forEach(e -> System.out.println(e))
23
53

jshell> List.of(23, 12, 34, 53).stream().filter(e -> e%2==1).collect(Collectors.toList());
$6 ==> [23, 53]

jshell> List.of(23, 12, 34, 53).stream().min((n1, n2) -> Integer.compare(n1, n2)).get();
$8 ==> 12

解説

このスニペットのポイントを整理すると、次のようになります。

  • reduce():初期値0から始めて、各要素を順番に加算していき、合計値「55」を返します。
  • max() / min():引数には必ずComparatorが必要です。引数なしで呼び出すとコンパイルエラーになる点に注意しましょう。戻り値はOptional型でラップされているため、isPresent()で値の存在を確認したり、get()で実際の値を取り出したりできます。
  • forEach()collect():filterで奇数だけを抽出した後、forEachで各要素を出力するか、collect(Collectors.toList())でリストとしてまとめることができます。

JShellを使えば、これらのストリーム操作を一行ずつ手軽に試せるため、ラムダ式やComparatorの書き方をその場で検証しながら学習を進められます。

  1. JavaのMath.random()メソッド徹底解説!乱数生成の基本から範囲指定まで

    JavaのMath.random()メソッドは、0.0以上1.0未満の擬似乱数(疑似ランダムな数値)を生成するためのメソッドです。生成された乱数に別の数値を掛けることで、0〜1以外の任意の範囲の乱数を取得することもできます。結果が0になることはあっても、1以上になることはありません。 プログラミングで乱数が必要になる場面 プログラミングをしていると、ランダムな数値を生成したい場面によく出会います。例えば、クルーズ船会社を運営しているとしましょう。顧客の注文番号として使う予約参照番号をランダムに生成したり、数当てゲーム用のランダムな数字を作りたいといったケースが考えられます。 Javaには、乱

  2. Java 9のJShellで例外はどう扱われる?自動キャッチの仕組みと具体例

    JShellとはJava 9で導入されたJShellは、Java言語の機能や豊富なライブラリを素早く探索・発見・実験できる、高速で使いやすい対話型環境(REPL)です。コードを1行ずつ入力して即座に結果を確認できるため、学習やプロトタイピングに最適なツールといえます。JShellにおける例外処理の仕組み通常のJavaプログラムでは、try-catchブロックなどを使って例外を明示的に捕捉する必要があります。しかし、JShellでは例外を手動でキャッチする必要がありません。JShellは発生した各例外を自動的にキャッチし、例外の種類やメッセージなどの情報を表示した後、次のJShellプロンプトを