【问题标题】:Filter Custom Objects in Array list or List [duplicate]过滤数组列表或列表中的自定义对象[重复]
【发布时间】:2018-07-10 10:00:27
【问题描述】:

我在数组 List 中有 50 个自定义类(类名:学生)对象。

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 中过滤学生年龄。我从上个月开始学习android。除了在互联网上循环数组列表以实现相同的目的之外,我没有得到任何答案。

【问题讨论】:

  • 除了循环数组列表之外的任何最快方法 ...显然,使用自定义谓词,如果不迭代所有元素就无法过滤

标签: android list arraylist filter


【解决方案1】:

您使用 Lightweight-Stream-API:

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

然后使用:

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

拉姆达:

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

【讨论】:

  • 你好兄弟。我收到此错误“java.lang.ClassCastException:java.util.stream.Collectors$CollectorImpl 无法转换为 com.annimon.stream.Collector”。当我使用你的第一个选项时。
  • 请导入 com.annimon.sream.Collector
  • 删除 import java.util.stream.Collectors 然后添加 import com.annimon.stream.Collector。
【解决方案2】:

你可以使用retrolambda库来获取Java 8 stream类似的功能:

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

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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.4.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0' // Add this         
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2017-06-14
相关资源
最近更新 更多