よくある落とし穴
Streamで起こりやすいミスを避けます。Streamの再利用、隠れた副作用、パラレル処理と可変状態を扱います。
「よくある落とし穴」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
導入
Stream は強力ですが、落とし穴もあります。Stream の再利用、隠れた副作用、可変状態と並列処理の組み合わせなどです。
一度しか使えない Stream
Stream は一度しか使えません。終端操作(forEach、collect、reduce)の後は、再び使用できません。
コード:再利用エラー
終端操作の後、Stream は消費済みになります。再利用しようとすると IllegalStateException がスローされます。
import java.util.*;import java.util.stream.*;public class Main {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3);
Stream<Integer> s = nums.stream();
s.forEach(System.out::println); // terminal
try {
s.forEach(System.out::println); // reuse -> IllegalStateException
} catch (IllegalStateException e) {
System.out.println("Oops: " + e.getMessage());
}
}
}
副作用
map/filter の内部では、外部リストを変更するなどの副作用を避けてください。純粋関数を使用し、最後に collect() することをお勧めします。
コード:副作用と collect の比較
パイプライン内で状態を変更する方法は壊れやすいものです。collect()を使うバージョンのほうが明確で安全です。
import java.util.*;import java.util.stream.*;public class Main {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1,2,3);
// Pitfall: mutating external list from map/forEach
List<Integer> out = new ArrayList<>();
nums.stream().map(n -> { out.add(n*n); return n*n; }).forEach(x -> {});
System.out.println("With side effects: " + out);
// Better: use collect to build the result
List<Integer> squares = nums.stream().map(n -> n*n).collect(Collectors.toList());
System.out.println("With collect: " + squares);
}
}
コード:Parallel Stream と可変状態
Parallel Stream と可変コンテナーを組み合わせると、競合状態が発生する可能性があります。並行処理に対応した collect() を使用してください。
import java.util.*;public class Main {
public static void main(String[] args) {
List<Integer> nums = java.util.Arrays.asList(1,2,3,4,5);
// Pitfall: adding to a normal ArrayList from parallel pipeline (unsafe)
List<Integer> unsafe = new ArrayList<>();
nums.parallelStream().forEach(n -> unsafe.add(n)); // may be unsafe
System.out.println("Parallel add to ArrayList (unsafe demo): " + unsafe);
// Safer: use built-in collectors
List<Integer> safe = nums.parallelStream().map(n -> n).collect(java.util.stream.Collectors.toList());
System.out.println("Collected safely: " + safe);
}
}
落とし穴の確認
クイックチェック:初心者が陥りやすい Stream の落とし穴はどれですか。
まとめ
まとめ:1) Stream は一度しか使えません。2) パイプライン内の副作用を避けてください。3) Parallel Stream と安全でない可変状態を組み合わせないでください。
よくある質問
「よくある落とし穴」レッスンは無料ですか?
はい。「よくある落とし穴」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「よくある落とし穴」で何を学びますか?
Streamで起こりやすいミスを避けます。Streamの再利用、隠れた副作用、パラレル処理と可変状態を扱います。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「よくある落とし穴」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 順序制御と短絡評価
- パラレルStreamの基礎
- よくある落とし穴