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