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
คำอธิบายขั้นตอน:
stream()- สร้าง Stream จาก Listfilter(i -> i > 5)- กรองเฉพาะค่า > 5mapToInt(i -> i)- แปลง Stream→ IntStream (primitive, เร็วกว่า) 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 เร็วกว่า