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の書き方をその場で検証しながら学習を進められます。
-
JavaのMath.random()メソッド徹底解説!乱数生成の基本から範囲指定まで
JavaのMath.random()メソッドは、0.0以上1.0未満の擬似乱数(疑似ランダムな数値)を生成するためのメソッドです。生成された乱数に別の数値を掛けることで、0〜1以外の任意の範囲の乱数を取得することもできます。結果が0になることはあっても、1以上になることはありません。 プログラミングで乱数が必要になる場面 プログラミングをしていると、ランダムな数値を生成したい場面によく出会います。例えば、クルーズ船会社を運営しているとしましょう。顧客の注文番号として使う予約参照番号をランダムに生成したり、数当てゲーム用のランダムな数字を作りたいといったケースが考えられます。 Javaには、乱
-
Java 9のJShellで例外はどう扱われる?自動キャッチの仕組みと具体例
JShellとはJava 9で導入されたJShellは、Java言語の機能や豊富なライブラリを素早く探索・発見・実験できる、高速で使いやすい対話型環境(REPL)です。コードを1行ずつ入力して即座に結果を確認できるため、学習やプロトタイピングに最適なツールといえます。JShellにおける例外処理の仕組み通常のJavaプログラムでは、try-catchブロックなどを使って例外を明示的に捕捉する必要があります。しかし、JShellでは例外を手動でキャッチする必要がありません。JShellは発生した各例外を自動的にキャッチし、例外の種類やメッセージなどの情報を表示した後、次のJShellプロンプトを