【Java】Stream API

に公開

Stream APIとは?

  • リストや配列などのデータを「流れるデータの流れ(ストリーム)」として処理するしくみ。
  • 「繰り返し処理」や「フィルタリング」「変換」「集計」などを、シンプルに記述出来るようになる。

基本的な流れ

データ.stream()      // 1.Stream作成
     .中間操作()     // 2.中間操作
     .終端操作();   // 3.終端操作

1.Stream作成:配列やリストなどのデータからStreamを作成
2.中間操作:フィルタリング・変換などを行う(複数可)
3.終端操作:結果を出力・集計・リスト化

使用例

package streamAPITest;

import java.util.Arrays;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("Java", "Python", "Php");

		// Streamを使った処理
		names.stream()
				.map(name -> name.toUpperCase()) //変換(小文字 → 大文字)
				.forEach(System.out::println); //出力
	}
}

<出力例>

中間操作について

主な操作

操作 説明
map(関数) 各要素を変換(例:"abc" → "ABC")
filter(条件) 条件に合う要素だけを残す
distinct() 重複を除去する
sorted() 要素を並び替える

使用例

filter(条件):5文字以上の名前だけを大文字にする

package streamAPITest;

import java.util.Arrays;
import java.util.List;

public class MainFilter {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("Java", "Python", "Php", "JavaScript");

		names.stream()
				.filter(name -> name.length() >= 5) // 5文字以上の名前だけ残す
				.map(name -> name.toUpperCase()) //大文字に変換
				.forEach(System.out::println); //出力
	}
}

<出力例>

distinct():文字列リストの重複を削除

package streamAPITest;

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

public class MainDistinct {
	public static void main(String[] args) {
		List<String> words = Arrays.asList("apple", "banana", "apple", "cherry", "banana", "date");

		// distinct() で重複を削除
		List<String> uniqueWords = words.stream()
				.distinct()
				.collect(Collectors.toList());

		System.out.println("重複を削除したリスト: " + uniqueWords);
	}
}

<出力例>

sorted():数字を降順に並び替え

package streamAPITest;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

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

		// 降順にソート
		List<Integer> sortedNumbers = numbers.stream()
				.sorted(Comparator.reverseOrder()) // 逆順
				.collect(Collectors.toList());

		System.out.println("降順ソート: " + sortedNumbers);
	}
}

<出力例>

終端操作について

主な操作

操作 説明
forEach(処理) 全要素に対して処理を実行
collect(Collectors.toList()) リストに変換
count() 要素数を取得
findFirst() 最初の要素を取得
anyMatch(条件) 条件に合う要素が1つでもあればtrue

使用例

collect:フィルタリング後のデータをリストに保存

package streamAPITest;

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

public class MainFilter2 {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("Java", "Python", "Php", "JavaScript");

		List<String> result = names.stream()
				.filter(name -> name.startsWith("J")) //Jで始まる名前を抽出
				.collect(Collectors.toList()); // 結果をリスト化

		System.out.println(result);
	}
}

<出力例>

count():カリキュラム数を数える

package streamAPITest;

import java.util.Arrays;
import java.util.List;

public class MainCount {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("Java", "Python", "Php", "JavaScript");

		// 要素の総数を取得
		long count = names.stream().count();

		System.out.println("カリキュラム数: " + count);
	}
}

<出力例>

findFirst():"J" で始まる最初の名前を取得

package streamAPITest;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class MainFindFirst {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("Java", "Python", "Php", "JavaScript");

		// "J" で始まる最初の名前を取得
		Optional<String> firstMatch = names.stream()
				.filter(name -> name.startsWith("J"))
				.findFirst();

		// データがあった場合、結果を表示
		firstMatch.ifPresent(name -> System.out.println("Cで始まる最初の名前: " + name));
	}
}

<出力例>

anyMatch(条件):300円以上の商品があるか

package streamAPITest.anymatch;

import java.util.Arrays;
import java.util.List;

public class MainAnyMatch {
	public static void main(String[] args) {
		List<Item> itemList = Arrays.asList(new Item(1, "りんご", 100), new Item(2, "ぶどう", 350), new Item(3, "いちご", 480));
		boolean overPrice = itemList.stream().anyMatch(price -> price.getPrice() >= 300);
		System.out.println("300円以上の商品があるか:" + overPrice);
	}
}

https://zenn.dev/codek2/articles/7fbfa22ba62e69

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion