
หลังจากที่มีเรียน TDD ที่จีน
พบว่าเหล่า Java developer ที่มาเรียน รวมทั้งผู้สอน
ใช้งานพวก Stream API และ Lambda expression กันเยอะมาก
ดังนั้น จึงขอเริ่มศึกษาแบบจริงจังกันหน่อย
เริ่มต้นจากการเขียน code น่าจะดีที่สุด
ซึ่งทำการศึกษาจาก Stream.reduction
มาเริ่มกันเลย
เริ่มจากข้อมูลตัวอย่าง เป็นข้อมูลของ User ประกอบไปด้วย
- รหัส
- ชื่อ
- อายุ
- เพศ
โดยข้อมูลตัวอย่างมี 5 user ดังนี้
List users = Arrays.asList(
new User(1, "Test 01", 12, User.SEX.MALE),
new User(2, "Test 02", 20, User.SEX.FEMALE),
new User(3, "Test 03", 30, User.SEX.MALE),
new User(4, "Test 04", 30, User.SEX.FEMALE),
new User(5, "Test 05", 20, User.SEX.FEMALE)
);
จากนั้นลองมาตั้งโจทย์สนุกๆ เพื่อเริ่มใช้งาน Stream API กันดีกว่า
1. จงหาอายุเฉลี่ยของ user ทั้งหมด ?
double average = users.stream()
.mapToInt(User::getAge)
.average().getAsDouble();
2. จงหาอายุรวมของ user ทั้งหมด ?
double sum = users.stream()
.mapToInt(User::getAge)
.sum();
หรือสามารถใช้ผ่าน Stream.reduce ได้ด้วยนะ
double sum = users.stream()
.mapToInt(User::getAge)
.reduce(0, (x, y) -> x + y);
3. จงกรองข้อมูลเฉพาะ user ที่เป็นผู้หญิง โดยให้ส่งผลลัพธ์ออกมาเป็น List ของ User นะ ?
ใช้งานผ่าน Stream.filter และ Stream.reduce
List females = users.stream()
.filter(p -> p.getGender() == User.SEX.FEMALE)
.collect(Collectors.toList());
4. จงทำการนับจำนวน user แบ่งกลุ่มตามเพศ ?
Map<User.SEX, Integer> map = users.stream()
.collect(Collectors.groupingBy(User::getGender,
Collectors.summingInt(p -> 1)));
5. ยังไม่พอ แต่ละเพศมี user ใดบ้าง ?
Map<User.SEX, List> usersByGender = users
.stream()
.collect(
Collectors.groupingBy(User::getGender));
6. จงแสดงรายชื่อของ user เพศชายทั้งหมดออกมา ย้ำว่าแสดงเฉพาะชื่อเท่านั้น ?
List namesOfMaleMembersCollect = users
.stream()
.filter(p -> p.getGender() == User.SEX.MALE)
.map(p -> p.getName())
.collect(Collectors.toList());
7. จงหาค่าเฉลี่ยของ user โดยแยกตามเพศ ?
Map<User.SEX, Double> averageAgeByGender = users
.stream()
.collect(
Collectors.groupingBy(
User::getGender,
Collectors.averagingInt(User::getAge)));
พอได้ลองฝึกใช้งาน เขียนตาม และ ทำความเข้าใจตาม
ก็พบว่า มันมีประโยชน์มากเลยนะ
สามารถลดจำนวน code ลงไปได้อย่างมาก
ดังนั้น Java developer ลองมาศึกษาและใช้งานกันดูนะครับ
มาฝึกใช้กันดีกว่า …