หลังจากที่มีเรียน 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 ลองมาศึกษาและใช้งานกันดูนะครับ
มาฝึกใช้กันดีกว่า …