LoginSignup
53
13

【Java】ラムダ式とStream APIメモ

Posted at

はじめに

Javaの案件の面談でよくラムダ式、Stream APIについて知見があるか質問されるのでまとめました。

ラムダ式、StreamAPIのメリット

ラムダ式のメリット:

  1. 可読性の向上
  2. 簡潔な構文
  3. 無名の関数を作成

Stream APIのメリット:

  1. 可読性の向上
  2. 並列処理によるパフォーマンスの改善

ラムダ式

Java 8以降で導入された機能です。
主に関数型インターフェースの実装を簡潔に書くために使用されます。
関数型インターフェースとは、抽象メソッドが1つだけ定義されているインターフェースのことを指します。
抽象メソッドとは、詳細未定(中身が無い)のメソッドのことを指します。

構文

 (引数) -> {処理内容};
  • 引数の型を記述する必要はありません
  • 引数は複数可能です
  • 引数が1つの場合は()を省略できます
サンプルコード
// 関数型インターフェース
public interface SampleInterface {
    // 抽象メソッド
    public void method(String name, int age);
}

public class Main {
 
    public static void main(String[] args) {
 
        // ラムダ式の場合
        SampleInterface lambda = (name, age) -> {
            return "ラムダ式:" + "名前は" + name + " " + "年齢は" + age + "歳";
        };
        System.out.println(sampleInterface.method("太郎", 20));
        
        // ラムダ式を使用しない場合(匿名クラス)
        SampleInterface anonymousClasses = new SampleInterface() {
            // オーバーライド
            public String method(String name, int n) {
                return "匿名クラス:" + "名前は" + name + " " + "年齢は" + age + "歳";
            }
        };
        System.out.println(sampleInterface.method("太郎", 20));
    }
  
}

Stream API

Java 8以降で導入された機能です。
コレクション(例: List, Map, Set)のデータ処理を効率的かつ簡潔に書くために使用されます。
for文、if文を使わず絞り込み、並び替えを行うことができます。

構文

 オブジェクト名.stream().中間操作(引数) -> 処理内容).終端操作(処理内容);
  • メソッドの引数にはラムダ式の記述様式を使用します

基本的な構文と代表的な機能

1.Streamの生成:
コレクションからStreamオブジェクトを作成できます。例えば、List の要素から stream() メソッドを呼び出すことで、整数のストリームを取得できます。

2.中間操作 (Intermediate Operations)
中間操作は、Streamを変換する操作です。主な中間操作には以下があります:

  • filter: 条件に一致する要素を抽出
  • map: 要素を別の型に変換
  • flatMap: 要素を別のStreamに変換し、それらのStreamを結合

3.終端操作 (Terminal Operations):
終端操作は、Streamから結果を生成する操作です。主な終端操作には以下があります:

  • forEach: 各要素に対してアクションを実行
  • collect: 要素をコレクションに収集
  • reduce: 要素を結合して単一の結果を生成
  • sum(): 数値要素の合計を求める
  • count(): 要素の数をカウント

4.遅延評価 (Lazy Evaluation):
Streamは遅延評価され、中間操作は終端操作が実行されるまで適用されません。これにより、効率的なデータ処理が可能です。

5.並列処理のサポート:
Stream APIは内部的に並列処理をサポートしており、マルチコアプロセッサーの恩恵を受けることができます。

サンプルコード
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 中間操作と終端操作を組み合わせて処理
        List<Integer> evenNumbers = numbers.stream()
            .filter(n -> n % 2 == 0)
            .collect(Collectors.toList());

        System.out.println(evenNumbers); // 出力: [2, 4]

        // 数値要素の合計を求める
        int sum = numbers.stream()
            .filter(n -> n % 2 == 0)
            .mapToInt(n -> n * 2)
            .sum();

        System.out.println("合計: " + sum); // 出力: 20
    }
}

まとめ

ラムダ式は関数型インターフェースの実装を簡潔に書く記述方法です。
Stream APIはコレクション(例: List, Map, Set)のデータをfor文、if文を使わず絞り込んだり、並び替えることができるAPIです。

参考記事

53
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
13