关于android:在Array列表或List中过滤自定义对象

Filter Custom Objects in Array list or List

本问题已经有最佳答案,请猛点这里访问。

我在数组列表中有50个自定义类(类名:student)对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Student {

    private String name;
    private String age;
    private String parent;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getParent() {
        return parent;
    }

    public void setParent(String parent) {
        this.parent = parent;
    }
}

我要过滤年龄为20岁的学生数组列表,并将其存储到另一个数组列表中。

注:

我试过用for循环。工作正常。但我想知道有没有最快的方法,除了循环数组列表过滤学生年龄。

我在iOS方面有一些经验。在iOS中,nspredicate用于从nsarray中过滤学生年龄。我从上个月开始学安卓。除了在Internet上循环数组列表,我没有得到任何答案来实现这一点。


可以使用反LAMBDA库获得Java 8流类似的功能:

1
2
3
4
List<Student> filteredList = StreamSupport
            .stream(yourInputStudentList)
            .filter(item -> item.getAge() =="20")
            .collect(Collectors.toList());

为此,您需要添加更新Gradle文件,如下所示:

1
2
3
4
5
6
7
8
9
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.4.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0' // Add this        
    }
}


使用轻量级流API:

1
2
3
4
dependencies {
    classpath 'com.android.tools.build:gradle:1.4.0'
    compile 'com.annimon:stream:1.1.2'
}

然后使用:

1
2
3
4
5
6
7
8
9
10
11
12
    import com.annimon.stream.Stream;
    import com.annimon.stream.function.Predicate;
    import com.annimon.stream.Collector;

..............

List<Student> filteredList = Stream.of(yourInputStudentList).filter(new Predicate<String>() {
            @Override
            public boolean test(Student item) {
                return item.getAge().equals("20");
            }
        }).collect(Collectors.toList());

Lamda:

1
2
3
4
5
6
    import com.annimon.stream.Stream;
    import com.annimon.stream.function.Predicate;

..............

List<Student> filteredList = Stream.of(yourInputStudentList).filter(item-> item.getAge().equals("20")).collect(Collectors.toList());