如何使用多成员变量条件过滤ArrayList?

S.J*_*Lim 0 java

我想获取年龄大于32且地址为city2的DataObj对象。
如何过滤这样的?

以下是尝试的代码。

package com.company;

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

        ArrayList<DataObj> arr_datalist = new ArrayList<DataObj>();
        ArrayList<DataObj> arr_filteredlist;
        arr_datalist.add(new DataObj(1, "aka", 30, "city1"));
        arr_datalist.add(new DataObj(2, "akb", 31, "city2"));
        arr_datalist.add(new DataObj(3, "akc", 32, "city2"));
        arr_datalist.add(new DataObj(4, "akd", 33, "city1"));
        arr_datalist.add(new DataObj(5, "ake", 34, "city3"));

        // age greater than 32 and address is city2.
        arr_filteredlist = arr_datalist.filter(???);

    }
}

class DataObj {
    int i_id;
    String str_name;
    int i_age;
    String str_address;

    DataObj(int id, String name, int age, String address) {
        this.i_id = id;
        this.str_name = name;
        this.i_age = age;
        this.str_address = address;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jea*_*art 5

您有几种常见的选择:

自己做:

List<DataObj> arr_filteredlist = new ArrayList<>();
for(DataObj e : arr_datalist) {
    if(e.i_age > 32 && e.str_address.equals("city2")) {
        arr_filteredlist.add(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

番石榴

Collection<DataObj> filteredColl = Collections2.filter(arr_datalist,
    new Predicate<DataObj>() {
        @Override
        boolean apply(DataObj e) {
            return e.i_age > 32 && e.str_address.equals("city2");
        }
        // + overrides equals
    });
List<DataObj> arr_filteredlist = new ArrayList<>(filteredColl);
Run Code Online (Sandbox Code Playgroud)

Java 8:

List<DataObj> arr_filteredlist = 
    arr_datalist.stream()
                .filter(e-> e.i_age > 32 && e.str_address.equals("city2"))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)