ข้อผิดพลาดที่พบบ่อย
หลีกเลี่ยงข้อผิดพลาดที่พบบ่อยในการใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงลำดับและการประเมินแบบลัด
- พื้นฐานสตรีมแบบขนาน
- ข้อผิดพลาดที่พบบ่อย