过滤数组列表或列表中的自定义对象[重复]

Posted

技术标签:

【中文标题】过滤数组列表或列表中的自定义对象[重复]【英文标题】: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。除了在互联网上循环数组列表以实现相同的目的之外,我没有得到任何答案。

【问题讨论】:

除了循环数组列表之外的任何最快方法 ...显然,使用自定义谓词,如果不迭代所有元素就无法过滤 【参考方案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         
    

【讨论】:

顺便说一句:年龄不应该是字符串,而是整数?不过题外话了。 它说“无法解析方法'stream(java.util.List)'。 见***.com/questions/45704901/…

以上是关于过滤数组列表或列表中的自定义对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Kendo UI Mobile列表视图的自定义过滤器?

使用键更新数组中的自定义对象[重复]

过滤自定义对象的 NSMutable 数组

json.net中属性的自定义反序列化[重复]

返回具有列表的jpa中的自定义对象

根据自定义对象属性从数组列表中删除元素