0Pricing
Java Academy · レッスン

よくある落とし穴

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 順序制御と短絡評価
  2. パラレルStreamの基礎
  3. よくある落とし穴
← Java Academyに戻る