การแมปไปยังและจากสตรีมออบเจ็กต์
mapToObj และ mapToInt
การแมปไปยังและจากสตรีมออบเจ็กต์ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
โลกของสตรีมสองแบบ
Java มีสตรีมออบเจ็กต์ (Stream<T>) และสตรีมชนิดพื้นฐาน (IntStream และชนิดอื่นที่คล้ายกัน) เมธอดสำหรับการแมปช่วยให้คุณแปลงข้ามระหว่างสตรีมเหล่านี้ได้
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
System.out.println(IntStream.rangeClosed(1, 3).sum());
}
}mapToObj: จากชนิดพื้นฐานเป็นออบเจ็กต์
mapToObj แปลงชนิดพื้นฐานแต่ละค่าเป็นออบเจ็กต์ และสร้าง Stream<T>
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<String> labels = IntStream.rangeClosed(1, 3)
.mapToObj(n -> "item-" + n)
.collect(Collectors.toList());
System.out.println(labels);
}
}mapToInt: จากออบเจ็กต์เป็นชนิดพื้นฐาน
mapToInt ดึงค่า int จากออบเจ็กต์แต่ละรายการ และสร้าง IntStream ที่พร้อมสำหรับการรวมค่าด้านตัวเลข
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("hi", "hello", "hey");
int totalChars = words.stream()
.mapToInt(String::length)
.sum();
System.out.println(totalChars);
}
}boxed: จากชนิดพื้นฐานเป็นสตรีมตัวห่อ
boxed เปลี่ยน IntStream เป็น Stream<Integer> ซึ่งจำเป็นก่อนรวบรวมเป็น List
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<Integer> list = IntStream.rangeClosed(1, 5)
.boxed()
.collect(Collectors.toList());
System.out.println(list);
}
}mapToLong และ mapToDouble
รูปแบบเดียวกันนี้ใช้กับชนิดพื้นฐานอื่นได้ด้วย ได้แก่ mapToLong และ mapToDouble
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> prices = List.of("9.99", "19.50", "4.25");
double total = prices.stream()
.mapToDouble(Double::parseDouble)
.sum();
System.out.println(total);
}
}เหตุผลที่ mapToInt เหนือกว่า map
การใช้ map กับสตรีมออบเจ็กต์จะทำให้ค่าต่าง ๆ ยังคงถูกห่อไว้ ส่วน mapToInt เปิดให้ใช้เมธอดด้านตัวเลข เช่น sum และ average พร้อมหลีกเลี่ยงการห่อชนิดข้อมูล
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(10, 20, 30);
double avg = nums.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
System.out.println(avg);
}
}ไปกลับ: จากออบเจ็กต์เป็น int แล้วกลับเป็นออบเจ็กต์
คุณสามารถเดินทางได้ทั้งสองทิศทางภายในสายการประมวลผลเดียว: ดึงตัวเลขออกมา แปลงค่า แล้วแมปกลับเป็นออบเจ็กต์
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("a", "bb", "ccc");
List<String> report = words.stream()
.mapToInt(String::length)
.mapToObj(len -> "len=" + len)
.collect(Collectors.toList());
System.out.println(report);
}
}asLongStream และ asDoubleStream
ภายในสตรีมชนิดพื้นฐาน คุณสามารถขยายชนิดข้อมูลได้ด้วย asLongStream และ asDoubleStream ซึ่งหลีกเลี่ยงการห่อชนิดข้อมูลขณะเปลี่ยนขนาดของชนิดตัวเลข
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
double avg = IntStream.of(1, 2, 3, 4)
.asDoubleStream()
.average()
.getAsDouble();
System.out.println(avg);
}
}การรวบรวมผลลัพธ์ชนิดพื้นฐาน
หากต้องการรวบรวมชนิดพื้นฐานเป็นคอลเลกชัน ให้เรียก boxed ก่อน แล้วจึงใช้ตัวรวบรวม
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Set<Integer> evens = IntStream.rangeClosed(1, 10)
.filter(n -> n % 2 == 0)
.boxed()
.collect(Collectors.toSet());
System.out.println(evens);
}
}flatMapToInt
flatMapToInt ทำให้ออบเจ็กต์หลายรายการรวมเป็น IntStream เดียว เหมาะเมื่อออบเจ็กต์แต่ละรายการให้ผลเป็นตัวเลขหลายค่า
import java.util.List;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
int sum = rows.stream()
.flatMapToInt(Arrays::stream)
.sum();
System.out.println(sum);
}
}การเลือก Mapper ที่เหมาะสม
เลือกตามทิศทาง:
- จากออบเจ็กต์เป็นชนิดพื้นฐาน:
mapToInt,mapToLong,mapToDouble - จากชนิดพื้นฐานเป็นออบเจ็กต์:
mapToObjหรือboxed
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> in = List.of("x", "yy");
String out = in.stream()
.mapToInt(String::length)
.mapToObj(Integer::toString)
.collect(Collectors.joining(","));
System.out.println(out);
}
}ตรวจสอบอย่างรวดเร็ว
เมธอดใดเปลี่ยน IntStream เป็น Stream<Integer>
สรุปทบทวน
คุณได้แปลงไปมาระหว่างสตรีมออบเจ็กต์และสตรีมชนิดพื้นฐาน:
mapToInt/mapToLong/mapToDoubleแปลงจากออบเจ็กต์เป็นชนิดพื้นฐานmapToObjและboxedแปลงจากชนิดพื้นฐานเป็นออบเจ็กต์flatMapToIntทำให้ตัวเลขหลายค่ารวมเป็น IntStream เดียว- การเข้าสู่สตรีมชนิดพื้นฐานช่วยให้ใช้ค่ารวมด้านตัวเลขได้โดยไม่ต้องห่อชนิดข้อมูล
คำถามที่พบบ่อย
บทเรียน “การแมปไปยังและจากสตรีมออบเจ็กต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแมปไปยังและจากสตรีมออบเจ็กต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแมปไปยังและจากสตรีมออบเจ็กต์”
mapToObj และ mapToInt คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การแมปไปยังและจากสตรีมออบเจ็กต์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- IntStream และ LongStream
- การดำเนินการช่วงและการรวมค่า
- การแมปไปยังและจากสตรีมออบเจ็กต์
- การสร้างสตรีมชนิดพื้นฐาน