0Pricing
Java Academy · บทเรียน

ข้อผิดพลาดที่พบบ่อย

หลีกเลี่ยงข้อผิดพลาดที่พบบ่อยในการใช้ Streams ได้แก่ การนำสตรีมกลับมาใช้ซ้ำ ผลข้างเคียงที่ซ่อนอยู่ และการใช้ parallel ร่วมกับสถานะที่เปลี่ยนแปลงได้

ข้อผิดพลาดที่พบบ่อย เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 3 บทเรียน

บทนำ

สตรีมมีประสิทธิภาพมาก แต่ก็มี ข้อควรระวัง เช่น การใช้สตรีมซ้ำ ผลข้างเคียงที่ซ่อนอยู่ และการใช้สตรีมแบบขนานร่วมกับสถานะที่เปลี่ยนแปลงได้

สตรีมที่ใช้ได้ครั้งเดียว

สตรีมเป็นแบบ ใช้ได้ครั้งเดียว: หลังจากการดำเนินการปลายทาง เช่น forEach, collect หรือ reduce แล้ว จะไม่สามารถใช้สตรีมนั้นอีกได้

โค้ด: ข้อผิดพลาดจากการใช้ซ้ำ

หลังจากการดำเนินการปลายทาง สตรีมจะถูกใช้จนหมด การพยายามใช้ซ้ำจะทำให้เกิด 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);
  }
}

โค้ด: ขนาน + สถานะที่เปลี่ยนแปลงได้

สตรีมแบบขนานร่วมกับภาชนะที่เปลี่ยนแปลงได้อาจทำให้เกิดสภาวะการแข่งขัน ควรใช้ 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);
  }
}

ตรวจสอบข้อควรระวัง

ตรวจสอบอย่างรวดเร็ว: ข้อใดเป็นข้อควรระวังทั่วไปของสตรีมสำหรับผู้เริ่มต้น

สรุป

สรุป: 1) สตรีมใช้ได้ครั้งเดียว 2) หลีกเลี่ยงผลข้างเคียงในกระบวนการ 3) อย่าใช้สตรีมแบบขนานร่วมกับสถานะที่เปลี่ยนแปลงได้อย่างไม่ปลอดภัย

คำถามที่พบบ่อย

บทเรียน “ข้อผิดพลาดที่พบบ่อย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ข้อผิดพลาดที่พบบ่อย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ข้อผิดพลาดที่พบบ่อย”

หลีกเลี่ยงข้อผิดพลาดที่พบบ่อยในการใช้ Streams ได้แก่ การนำสตรีมกลับมาใช้ซ้ำ ผลข้างเคียงที่ซ่อนอยู่ และการใช้ parallel ร่วมกับสถานะที่เปลี่ยนแปลงได้ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “ข้อผิดพลาดที่พบบ่อย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียงลำดับและการประเมินแบบลัด
  2. พื้นฐานสตรีมแบบขนาน
  3. ข้อผิดพลาดที่พบบ่อย
← กลับไปที่ Java Academy