Stream

Java – Stream APIのfilterで複数条件指定する方法

JavaのStream APIのfilterメソッドで複数条件を指定するには、条件を論理演算子&&||で組み合わせます。

例えば、stream.filter(x -> x > 10 && x < 20)のように記述することで、値が10より大きく20未満の要素をフィルタリングできます。

条件が複雑な場合は、ラムダ式内でメソッドを呼び出して可読性を向上させることも可能です。

Stream APIのfilterメソッドとは

JavaのStream APIは、コレクションの要素を処理するための強力なツールです。

その中でも、filterメソッドは特定の条件に基づいて要素を選別するために使用されます。

filterメソッドは、Predicate(条件を表す関数)を引数に取り、条件を満たす要素だけを含む新しいStreamを返します。

これにより、データのフィルタリングが簡単に行えます。

基本的な使い方

filterメソッドの基本的な構文は以下の通りです。

stream.filter(condition)

ここで、conditionはPredicateインターフェースを実装した条件式です。

例えば、リスト内の偶数だけを選別する場合、次のように記述します。

以下は、filterメソッドを使用して偶数を選別する例です。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class App {
    public static void main(String[] args) {
        // 数値のリストを作成
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        // 偶数をフィルタリング
        List<Integer> evenNumbers = numbers.stream()
            .filter(number -> number % 2 == 0) // 偶数の条件
            .collect(Collectors.toList()); // リストに変換
        
        // 結果を出力
        System.out.println(evenNumbers); // 偶数のリストを表示
    }
}
[2, 4, 6, 8, 10]

このコードでは、1から10までの数値のリストから偶数だけを選別し、新しいリストに格納しています。

filterメソッドを使うことで、条件に合った要素を簡単に抽出できることがわかります。

filterで複数条件を指定する方法

filterメソッドを使用することで、複数の条件を組み合わせて要素を選別することができます。

JavaのStream APIでは、条件を論理演算子(AND、OR)を使って結合することで、複雑なフィルタリングが可能です。

ここでは、AND条件とOR条件の両方を使った例を紹介します。

AND条件でのフィルタリング

AND条件を使用する場合、すべての条件が真である要素のみを選別します。

以下のサンプルコードでは、偶数かつ5より大きい数値を選別します。

サンプルコード(AND条件)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class App {
    public static void main(String[] args) {
        // 数値のリストを作成
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        // 偶数かつ5より大きい数をフィルタリング
        List<Integer> filteredNumbers = numbers.stream()
            .filter(number -> number % 2 == 0) // 偶数の条件
            .filter(number -> number > 5) // 5より大きい条件
            .collect(Collectors.toList()); // リストに変換
        
        // 結果を出力
        System.out.println(filteredNumbers); // フィルタリングされたリストを表示
    }
}
[6, 8, 10]

このコードでは、偶数であり、かつ5より大きい数値を選別しています。

filterメソッドを連続して呼び出すことで、複数の条件を適用しています。

OR条件でのフィルタリング

OR条件を使用する場合、いずれかの条件が真である要素を選別します。

以下のサンプルコードでは、偶数または5より大きい数値を選別します。

サンプルコード(OR条件)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class App {
    public static void main(String[] args) {
        // 数値のリストを作成
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        // 偶数または5より大きい数をフィルタリング
        List<Integer> filteredNumbers = numbers.stream()
            .filter(number -> number % 2 == 0 || number > 5) // 偶数または5より大きい条件
            .collect(Collectors.toList()); // リストに変換
        
        // 結果を出力
        System.out.println(filteredNumbers); // フィルタリングされたリストを表示
    }
}
[2, 4, 6, 7, 8, 9, 10]

このコードでは、偶数または5より大きい数値を選別しています。

||演算子を使用することで、いずれかの条件を満たす要素を抽出しています。

filterメソッドを使うことで、複数の条件を簡単に指定してデータをフィルタリングできます。

AND条件やOR条件を組み合わせることで、より柔軟なデータ処理が可能になります。

実践例:filterで複数条件を使ったデータ処理

ここでは、filterメソッドを使用して複数の条件を組み合わせた実践的なデータ処理の例を紹介します。

具体的には、社員の情報を持つクラスを作成し、特定の条件に基づいて社員をフィルタリングします。

社員クラスの定義

まず、社員を表すクラスEmployeeを定義します。

このクラスには、名前、年齢、給与の属性を持たせます。

public class Employee {
    private String name; // 名前
    private int age; // 年齢
    private double salary; // 給与
    // コンストラクタ
    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    // ゲッター
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public double getSalary() {
        return salary;
    }
}

複数条件でのフィルタリング

次に、社員のリストを作成し、年齢が30歳以上かつ給与が500万円以上の社員をフィルタリングします。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class App {
    public static void main(String[] args) {
        // 社員のリストを作成
        List<Employee> employees = Arrays.asList(
            new Employee("佐藤", 28, 400),
            new Employee("鈴木", 35, 600),
            new Employee("高橋", 30, 500),
            new Employee("田中", 45, 700),
            new Employee("山田", 25, 300)
        );
        
        // 年齢が30歳以上かつ給与が500万円以上の社員をフィルタリング
        List<Employee> filteredEmployees = employees.stream()
            .filter(employee -> employee.getAge() >= 30) // 年齢の条件
            .filter(employee -> employee.getSalary() >= 500) // 給与の条件
            .collect(Collectors.toList()); // リストに変換
        
        // 結果を出力
        filteredEmployees.forEach(employee -> 
            System.out.println(employee.getName() + " - " + employee.getAge() + "歳 - " + employee.getSalary() + "万円")
        ); // フィルタリングされた社員の情報を表示
    }
}
鈴木 - 35歳 - 600万円
高橋 - 30歳 - 500万円
田中 - 45歳 - 700万円

このコードでは、社員のリストから年齢が30歳以上かつ給与が500万円以上の社員を選別しています。

filterメソッドを使うことで、複数の条件を簡単に組み合わせてデータを処理できることが示されています。

この実践例を通じて、filterメソッドを使用して複数の条件を指定し、特定のデータを抽出する方法を学びました。

実際のアプリケーションでは、こうしたフィルタリング処理が非常に役立ちます。

注意点とベストプラクティス

filterメソッドを使用する際には、いくつかの注意点とベストプラクティスがあります。

これらを理解しておくことで、より効率的で可読性の高いコードを書くことができます。

以下に主なポイントをまとめます。

条件式の簡潔さ

  • シンプルな条件を心がける: 複雑な条件式は可読性を低下させるため、可能な限りシンプルに保つことが重要です。
  • メソッド参照の活用: 条件が複雑な場合は、メソッドを別に定義して参照することで、コードを整理できます。

パフォーマンスの考慮

  • ストリームの遅延評価: Stream APIは遅延評価を行うため、必要なデータだけを処理しますが、フィルタリングの条件が多すぎるとパフォーマンスに影響を与えることがあります。
  • 早期終了の利用: findFirst()anyMatch()などのメソッドを使用して、条件に合う要素が見つかった時点で処理を終了することができます。

不変性の保持

  • 元のデータを変更しない: Stream APIを使用する際は、元のコレクションを変更せず、新しいコレクションを生成することが推奨されます。

これにより、データの不変性が保たれ、バグを防ぐことができます。

エラーハンドリング

  • 例外処理の実装: フィルタリング処理中に発生する可能性のある例外(例えば、NullPointerExceptionなど)に対して適切なエラーハンドリングを行うことが重要です。

コードの可読性

  • コメントの活用: 複雑な条件や処理を行う場合は、適切なコメントを追加して他の開発者が理解しやすいようにしましょう。
  • メソッドの分割: 大きな処理を一つのメソッドに詰め込むのではなく、適切にメソッドを分割して可読性を向上させることが重要です。

テストの実施

  • ユニットテストの作成: フィルタリング処理に対してユニットテストを作成し、期待通りの動作をすることを確認することが重要です。

これにより、将来的な変更に対する信頼性が向上します。

これらの注意点とベストプラクティスを考慮することで、filterメソッドを効果的に活用し、より良いコードを書くことができます。

特に、可読性やパフォーマンスに配慮することは、長期的なプロジェクトの成功に寄与します。

まとめ

この記事では、JavaのStream APIにおけるfilterメソッドの基本的な使い方から、複数条件を指定する方法、実践的なデータ処理の例、さらには注意点とベストプラクティスについて詳しく解説しました。

これにより、データのフィルタリングを効率的に行うための手法を身につけることができるでしょう。

今後は、実際のプロジェクトにおいてこれらの知識を活用し、より洗練されたコードを書くことを目指してみてください。

関連記事

Back to top button