Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Sum ของ List ด้วย Stream Filter ใน Java 8+

Stream API: Filter แล้ว Sum

ตัวอย่าง


import java.util.*;

public class Demo {
    public static void main(String[] args) {
        List list = Arrays.asList(11, 35, 56, 78, 91);
        
        // Filter > 5 แล้ว sum
        int sum = list.stream()
                      .filter(i -> i > 5)
                      .mapToInt(i -> i)
                      .sum();
        
        System.out.println("Sum of elements > 5: " + sum);
    }
}

ผลลัพธ์

Sum of elements > 5: 271

คำอธิบายขั้นตอน:

  1. stream() - สร้าง Stream จาก List
  2. filter(i -> i > 5) - กรองเฉพาะค่า > 5
  3. mapToInt(i -> i) - แปลง Stream → IntStream (primitive, เร็วกว่า)
  4. sum() - Terminal operation คำนวณผลรวม

รูปแบบอื่นๆ


// 1. ใช้ method reference
int sum = list.stream().filter(i -> i > 5).mapToInt(Integer::intValue).sum();

// 2. reduce (general purpose)
int sum = list.stream().filter(i -> i > 5).reduce(0, Integer::sum);

// 3. parallel stream (ข้อมูลเยอะ)
int sum = list.parallelStream().filter(i -> i > 5).mapToInt(i -> i).sum();

// 4. Collectors.summingInt
int sum = list.stream().filter(i -> i > 5).collect(Collectors.summingInt(i -> i));

// 5. กรอง null ก่อน (ถ้ามี null ใน list)
int sum = list.stream()
              .filter(Objects::nonNull)
              .filter(i -> i > 5)
              .mapToInt(i -> i)
              .sum();

Performance Notes

  • mapToInt สำคัญ - หลีกเลี่ยง boxing/unboxing ของ Integer
  • Parallel stream คุ้มค่าเมื่อข้อมูล > ~10,000 elements หรือ computation heavy
  • Stream มี overhead เล็กน้อย สำหรับ loop เรียบง่าย for-loop เร็วกว่า