網頁

2018/10/26

Java 8 使用Stream.collect依條件蒐集物件

在Java中常會有從一個集合(例如List)中依條件篩選元素,並將符合條件的元素放入另一個集合的操作,本篇介紹如何使用Java 8的Stream.filter()搭配Stream.collect()來達成。

下面是List中的元素Person類別

Person.java

public class Person {

    enum Sex {
        MALE, FEMALE;
    }

    private String name;
    private Sex gender;
    private int age;

    public Person(String name, Sex gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    // 省略getter setter
}

下面分別使用原本for loop的方式及Java 8的Stream.filter()搭配Stream.collect()來篩選出男性,年齡小於18歲的兒童,並放入新的List容器中。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
// ....

List<Person> personList = Arrays.asList(
            new Person("John", Sex.MALE, 10),
            new Person("Mary", Sex.FEMALE, 11),
            new Person("Bill", Sex.MALE, 12),
            new Person("Jane", Sex.FEMALE, 21),
            new Person("Tony", Sex.MALE, 22)
        );

// 使用傳統的for loop
List<Person> maleChildrenList1 = new ArrayList<>();
for(Person person : personList) {
    if(person.getGender() == Person.Sex.MALE) {
        if(person.getAge() < 18) {
            maleChildrenList1.add(person);
        }
    }
}
for(Person person : maleChildrenList1) {
    System.out.println(person.getName() + ":" + person.getGender() + ":" + person.getAge());
}

// Java 8 Stream.fitler, Stream.collect
List<Person> maleChildrenList2 = personList.stream()
        .filter(e -> e.getGender() == Person.Sex.MALE)
        .filter(e -> e.getAge() < 18)
        .collect(Collectors.toList());

maleChildrenList2.forEach(
        e -> System.out.println(e.getName() + ":" + e.getGender() + ":" + e.getAge()));

Stream.collect()的輸入參數為Collector,可使用java.util.stream.Collectors.toList(),此方法會將filter後的Stream中的元素放入新的ArrayList中。

toList()其方法同Collectors.toCollection(ArrayList::new)如下:

List<Person> maleChildrenList2 = personList.stream()
        .filter(e -> e.getGender() == Person.Sex.MALE)
        .filter(e -> e.getAge() < 18)
        .collect(Collectors.toCollection(ArrayList::new)); // Java 8 method references語法

如果本篇有幫助到您,幫忙點一下廣告支持,感恩。


參考:

2 則留言:

  1. 很清楚 比openhome清楚 還附上person物件 讚讚 幫你點廣告

    回覆刪除
  2. 這篇很棒 謝謝~

    回覆刪除