✨
【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);
}
}
Udemyで講座を公開中!
X(旧Twitter)
Zenn 本
Youtube
Discussion