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

การแมปไปยังและจากสตรีมออบเจ็กต์

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. IntStream และ LongStream
  2. การดำเนินการช่วงและการรวมค่า
  3. การแมปไปยังและจากสตรีมออบเจ็กต์
  4. การสร้างสตรีมชนิดพื้นฐาน
← กลับไปที่ Java Academy