Java Streams สำหรับผู้เริ่มต้น: บทนำสู่การใช้สตรีมใน Java

Java Streams สำหรับผู้เริ่มต้น: บทนำสู่การใช้สตรีมใน Java

สตรีม Java 8 ช่วยให้นักพัฒนาสามารถดึงข้อมูลที่แม่นยำจากคอลเล็กชันขนาดใหญ่ โดยใช้ชุดการดำเนินการที่กำหนดไว้ล่วงหน้า





ก่อนการเปิดตัว Java 8 การใช้คำว่า 'สตรีม' ใน Java จะเชื่อมโยงกับ I/O โดยอัตโนมัติ อย่างไรก็ตาม Java 8 ได้แนะนำสตรีมที่สามารถเรียกได้ว่าเป็นชุดของขั้นตอนการคำนวณที่เชื่อมโยงเข้าด้วยกันในสิ่งที่เรียกกันทั่วไปว่า 'สตรีมไปป์ไลน์'





บทความนี้จะแนะนำคุณเกี่ยวกับสตรีม Java 8 และสาธิตวิธีที่จะมีประโยชน์ในโครงการของคุณ





สตรีมคืออะไร?

สตรีมคืออินเทอร์เฟซ Java ที่รับแหล่งที่มา ดำเนินการชุดของการดำเนินการเพื่อดึงข้อมูลเฉพาะ จากนั้นให้ข้อมูลนั้นแก่แอปพลิเคชันเพื่อใช้งาน โดยพื้นฐานแล้วจะช่วยให้คุณสามารถดึงข้อมูลเฉพาะจากชุดข้อมูลทั่วไปได้

วิธีการทำงานของสตรีม

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



ในการแปลงคอลเล็กชันเป็นสตรีมเริ่มต้น คุณจะต้องเพิ่ม ลำธาร() ทำหน้าที่ต้นทาง สิ่งนี้จะวางต้นทางลงในไปป์ไลน์ของสตรีมซึ่งมีการดำเนินการระดับกลางที่แตกต่างกันหลายอย่าง (เช่น กรอง() และ เรียงลำดับ() ) สามารถทำงานได้

หลังจากดำเนินการขั้นกลางที่จำเป็นทั้งหมดแล้ว คุณสามารถแนะนำการทำงานของเทอร์มินัล (เช่น แต่ละ() ) ซึ่งจะสร้างข้อมูลที่ดึงมาจากแหล่งที่มาก่อนหน้านี้





ชีวิตที่ปราศจากสตรีม

Java 8 เปิดตัวในปี 2014 แต่ก่อนหน้านั้น นักพัฒนา Java ยังจำเป็นต้องดึงข้อมูลเฉพาะออกจากชุดข้อมูลทั่วไป

วิธีเปิดสวิตช์ทีวี

สมมติว่าคุณมีรายการอักขระสุ่มที่รวมกับตัวเลขสุ่มเพื่อสร้างค่าสตริงที่ไม่ซ้ำ แต่คุณต้องการเฉพาะค่าที่ขึ้นต้นด้วยอักขระ C และคุณต้องการจัดเรียงผลลัพธ์ตามลำดับจากน้อยไปมาก นี่คือวิธีที่คุณจะดึงข้อมูลนั้นโดยไม่มีสตรีม





ที่เกี่ยวข้อง: สิ่งที่คุณต้องรู้เกี่ยวกับการใช้สตริงใน Java

ตัวอย่างการกรองและการเรียงลำดับค่าที่ไม่มีสตรีม


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//declare the array list will store needed values
List requiredValues = new ArrayList();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith('C')) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}

คุณจะต้องประกาศและเริ่มต้นรายการอาร์เรย์ด้วย ไม่ว่าคุณจะใช้สตรีมหรือวิธีการแยกอื่นๆ สิ่งที่คุณไม่ต้องทำหากคุณใช้สตรีมคือประกาศตัวแปรใหม่เพื่อเก็บค่าที่ต้องการ และไม่สร้างโค้ดบวกอีกห้าบรรทัดในตัวอย่างด้านบน

ที่เกี่ยวข้อง: วิธีสร้างและดำเนินการกับอาร์เรย์ใน Java

รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ในคอนโซล:


C11
C12
C13
C14
C15
C16

ชีวิตกับสตรีม

ในการเขียนโปรแกรม ประสิทธิภาพหมายถึงการสร้างผลลัพธ์เดียวกันโดยใช้โค้ดที่น้อยลงอย่างมาก นี่คือสิ่งที่ท่อส่งกระแสข้อมูลทำเพื่อโปรแกรมเมอร์ ดังนั้นในครั้งต่อไปที่มีคนถาม: เหตุใดการใช้สตรีมในโปรเจ็กต์ของคุณจึงสำคัญ พูดง่ายๆ คือ สตรีมสนับสนุนการเขียนโปรแกรมที่มีประสิทธิภาพ

ต่อจากตัวอย่างด้านบน นี่คือวิธีที่การแนะนำสตรีมเปลี่ยนทั้งโปรแกรม

การกรองและการจัดเรียงค่าด้วยตัวอย่างสตรีม


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

โค้ดด้านบนแสดงให้เห็นว่าอินเทอร์เฟซของสตรีมมีประสิทธิภาพเพียงใด ใช้รายการค่าอาร์เรย์สุ่มและแปลงเป็นสตรีมโดยใช้ ลำธาร() การทำงาน. จากนั้นสตรีมจะลดลงเป็นรายการอาร์เรย์ที่มีค่าที่ต้องการ (ซึ่งเป็นค่าทั้งหมดที่ขึ้นต้นด้วย ), ใช้ กรอง() การทำงาน.

ดังที่คุณเห็นในตัวอย่างข้างต้น the ค่าจะถูกจัดเรียงแบบสุ่มในรายการอาร์เรย์ หากคุณต้องพิมพ์สตรีม ณ จุดนี้ในไพพ์ไลน์ ค่า C15 จะพิมพ์ก่อน ดังนั้น เรียงลำดับ() ฟังก์ชันถูกนำไปใช้กับสตรีมไปป์ไลน์เพื่อจัดเรียงอาร์เรย์ใหม่ตามลำดับจากน้อยไปมาก

ฟังก์ชันสุดท้ายในท่อส่งกระแสข้อมูลคือ a แต่ละ() การทำงาน. นี่คือฟังก์ชันเทอร์มินัลที่ใช้เพื่อหยุดไปป์ไลน์สตรีมและสร้างผลลัพธ์ต่อไปนี้ในคอนโซล:


C11
C12
C13
C14
C15
C16

สตรีมการดำเนินงานระดับกลาง

มีรายการการดำเนินการระดับกลางมากมายที่สามารถใช้ในไปป์ไลน์สตรีมได้

ไปป์ไลน์สตรีมเริ่มต้นด้วยแหล่งเดียวและ ลำธาร() และจบลงด้วยการดำเนินการเทอร์มินัลเดียวเสมอ (แม้ว่าจะมีหลายขั้นตอนให้เลือก) แต่ในระหว่างสองส่วนนี้มีรายการการดำเนินการระดับกลางหกรายการที่คุณสามารถใช้ได้

ในตัวอย่างข้างต้น มีการใช้การดำเนินการขั้นกลางเพียงสองการดำเนินการเท่านั้น--- กรอง() และ เรียงลำดับ() . การดำเนินการขั้นกลางที่คุณเลือกจะขึ้นอยู่กับงานที่คุณต้องการดำเนินการ

หากค่าใดๆ ที่ขึ้นต้นด้วย C ในรายการอาร์เรย์ด้านบนเป็นตัวพิมพ์เล็ก และเราดำเนินการขั้นกลางแบบเดียวกันกับค่าเหล่านี้ เราจะได้ผลลัพธ์ดังต่อไปนี้

การดำเนินการกรองและเรียงลำดับค่าตัวพิมพ์เล็ก Example


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

รหัสด้านบนจะสร้างค่าต่อไปนี้ในคอนโซล:


C11
C12
C14
C15

ปัญหาเดียวของผลลัพธ์ข้างต้นคือมันไม่ได้แสดงถึง . ทั้งหมดอย่างถูกต้อง ค่าในรายการอาร์เรย์ของเรา วิธีที่ดีในการแก้ไขข้อผิดพลาดเล็กๆ น้อยๆ นี้คือการแนะนำการดำเนินการระดับกลางอื่นกับไปป์ไลน์ของสตรีม การดำเนินการนี้เรียกว่า แผนที่() การทำงาน.

การใช้ตัวอย่างฟังก์ชันแผนที่


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

NS แผนที่() ฟังก์ชั่นแปลงวัตถุจากสถานะหนึ่งไปยังอีกสถานะหนึ่ง ในตัวอย่างด้านบนของเรา จะแปลงอักขระตัวพิมพ์เล็กทั้งหมดในรายการอาร์เรย์เป็นอักขระตัวพิมพ์ใหญ่

การวาง แผนที่() ทำหน้าที่ก่อน กรอง() ฟังก์ชั่นดึงค่าทั้งหมดที่ขึ้นต้นด้วย จากรายการอาร์เรย์

โค้ดด้านบนสร้างผลลัพธ์ต่อไปนี้ในคอนโซล ซึ่งแสดงถึง . ทั้งหมดได้สำเร็จ ค่าในรายการอาร์เรย์


C11
C12
C13
C14
C15
C16

การดำเนินการระดับกลางอีกสามรายการที่คุณสามารถใช้ในแอปพลิเคชันของคุณ ได้แก่:

  • แอบมอง()
  • ขีด จำกัด ()
  • ข้าม()

Java 8 Streams อำนวยความสะดวกในการสร้างโค้ดที่มีประสิทธิภาพ

ด้วยสตรีม Java 8 คุณสามารถดึงข้อมูลที่เกี่ยวข้องและเจาะจงเพิ่มเติมจากแหล่งที่มาขนาดใหญ่ด้วยโค้ดหนึ่งบรรทัด ตราบใดที่คุณรวมชื่อย่อ ลำธาร() ฟังก์ชันและตัวดำเนินการเทอร์มินัล คุณสามารถใช้การดำเนินการระดับกลางร่วมกันแบบใดก็ได้ที่ให้ผลลัพธ์ที่เหมาะสมกับเป้าหมายของคุณ

วิธีใส่สาย Apple Watch

หากคุณสงสัยเกี่ยวกับบรรทัดของรหัสที่อยู่ภายใน กรอง() การทำงาน; เรียกว่า 'นิพจน์แลมบ์ดา' นิพจน์ Lambda เป็นคุณลักษณะอื่นที่นำมาใช้กับ Java 8 และมีนักเก็ตจำนวนมากที่คุณอาจพบว่ามีประโยชน์

แบ่งปัน แบ่งปัน ทวีต อีเมล ข้อมูลเบื้องต้นเกี่ยวกับ Java 8 Lambdas

หากคุณเป็นโปรแกรมเมอร์ Java และสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ Java 8 lambdas ในบทความนี้ เราจะพิจารณาไวยากรณ์และการใช้งานแลมบ์ดาอย่างละเอียดยิ่งขึ้น

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • การเขียนโปรแกรม
  • Java
  • บทเรียนการเข้ารหัส
เกี่ยวกับผู้เขียน คาเดชา คีน(21 บทความที่ตีพิมพ์)

Kadeisha Kean เป็นนักพัฒนาซอฟต์แวร์ฟูลสแตกและนักเขียนด้านเทคนิค/เทคโนโลยี เธอมีความสามารถที่ชัดเจนในการลดความซับซ้อนของแนวคิดทางเทคโนโลยีที่ซับซ้อนที่สุดบางส่วน การผลิตวัสดุที่สามารถเข้าใจได้ง่ายโดยสามเณรเทคโนโลยี เธอหลงใหลในการเขียน พัฒนาซอฟต์แวร์ที่น่าสนใจ และเดินทางไปทั่วโลก (ผ่านสารคดี)

เพิ่มเติมจาก Kadeisha Kean

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก