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()); |