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

Java 9のStream API新メソッドをマスターしよう:iterate()・takeWhile()・dropWhile()の使い方

Java 9のStream APIとは

Stream APIは、ストリームパイプラインを使ってコレクションに対するさまざまな操作を実行するための、豊富な組み込み機能を提供しています。宣言型プログラミングのスタイルを採用しているため、コードが簡潔になり、バグも発生しにくくなります。そしてJava 9では、Stream APIにさらに便利なメソッドが追加されました。

  • Stream.iterate():従来のforループの代わりとして使える、ストリーム版の反復処理メソッドです。初期値・終了条件・次の値を生成する関数を指定できます。
  • Stream.takeWhile()条件が満たされている間だけ要素を取得するメソッドです。whileループのような動作を実現できます。
  • Stream.dropWhile()条件が満たされている間、要素を破棄(スキップ)するメソッドです。条件が初めてfalseになった時点以降の要素をすべて返します。

以下の例では、Stream APIの静的メソッドである iterate()takeWhile()dropWhile() の具体的な実装方法を紹介します。

サンプルコード

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

public class StreamAPITest {
    public static void main(String args[]) {
        String[] sortedNames = {"Adithya", "Bharath", "Charan", "Dinesh", "Raja", "Ravi", "Zaheer"};

        System.out.println("[従来のforループ] Rで始まる名前のインデックス = ");
        for(int i = 0; i < sortedNames.length; i++) {
            if(sortedNames[i].startsWith("R")) {
                System.out.println(i);
            }
        }

        System.out.println("[Stream.iterate] Rで始まる名前のインデックス = ");
        Stream.iterate(0, i -> i < sortedNames.length, i -> ++i)
              .filter(i -> sortedNames[i].startsWith("R"))
              .forEach(System.out::println);

        String namesAtoC = Arrays.stream(sortedNames)
              .takeWhile(n -> n.charAt(0) <= 'C')
              .collect(Collectors.joining(","));

        String namesDtoZ = Arrays.stream(sortedNames)
              .dropWhile(n -> n.charAt(0) <= 'C')
              .collect(Collectors.joining(","));

        System.out.println("A〜Cの名前 = " + namesAtoC);
        System.out.println("D〜Zの名前 = " + namesDtoZ);
    }
}

実行結果

[従来のforループ] Rで始まる名前のインデックス =
4
5
[Stream.iterate] Rで始まる名前のインデックス =
4
5
A〜Cの名前 = Adithya,Bharath,Charan
D〜Zの名前 = Dinesh,Raja,Ravi,Zaheer

各メソッドのポイント

iterate()について:Java 8までのiterate()は引数が2つだけで無限ストリームを生成していましたが、Java 9では終了条件(述語)を指定できる3引数版が追加されました。これにより、従来のforループと同じ感覚で安全に反復処理を記述できます。上記の出力を見ると、forループとStream.iterate()が完全に同じ結果(インデックス4と5)を返していることが確認できます。

takeWhile()について:ソート済み配列に対して「先頭文字が'C'以下である間」という条件を指定しています。条件が初めてfalseになった'Dinesh'の時点で処理が打ち切られるため、結果は「Adithya,Bharath,Charan」のみとなります。

dropWhile()について:逆に、条件がtrueの間の要素を捨て、それ以降の要素をすべて返します。そのため「Dinesh,Raja,Ravi,Zaheer」が出力されます。なお、これらのメソッドは要素の順序が保証されている(ソート済みなどの)ストリームで使用することが前提であり、順序が不定の並列ストリームでは期待どおりの結果にならない場合がある点に注意しましょう。

  1. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー

  2. JavaのJWindowを使ってスプラッシュ画面を実装する方法

    JWindowは、デスクトップ上の任意の位置に表示できるコンテナです。JFrameと異なり、タイトルバーやウィンドウ管理ボタンなどの装飾要素を持ちません。JWindowは、唯一の子クラスとしてJRootPaneを含んでいます。そのcontentPaneが、JWindowに追加される子コンポーネントの親となります。JFrameと同様に、JWindowもトップレベルコンテナの一つであり、「装飾のない(undecorated)JFrame」と考えることができます。タイトルバーやウィンドウメニューといった機能は備えていません。この特性を活かすと、JWindowはスプラッシュ画面として利用できます。アプ