繁体   English   中英

根据某些字段的值从ArrayList中选择对象

[英]Selecting objects from an ArrayList based on value of certain fields

我有一个Course类,它有各种类型的字段,各自的getter和setter,例如:

float percentage
char courseLevel
String courseName
boolean takingNow

然后我有一个课程对象的ArrayList和一个方法:

public <T> ArrayList<Course> getCourses(int parameterId, T value) {
    ArrayList<Course> res = new ArrayList<Course>();
    switch(parameterId) {
        case COURSE_NAME:
            for(Course c: courseList) {
                if(c.getCourseName().equals(value) {
                    res.add(c)
                }
            }
            break;
        ....
        //rest of the cases
        ....
    }
    return res
}

然后该方法遍历课程的ArrayList并基于parameterId比较某个字段,如果课程字段等于传递的值,则将其添加到要返回的arraylist。

有没有比使用泛型更好的方法,我觉得这是一个非常糟糕的编码实践。

据我了解,您希望有一个方法返回符合指定条件的所有课程。

你可能会考虑调查lambdas ......起初它们看起来有点时髦,但它们真的很强大,一旦你习惯了它就很容易了。

对于您的示例,您可能有:

import java.util.ArrayList;
import java.util.function.Predicate;

class Course {

    float percentage;
    char courseLevel;
    String courseName;
    boolean takingNow;

    public static ArrayList<Course> allCourses;

    public ArrayList<Course> getCourses(Predicate<Course> coursePredicate) {
        ArrayList<Course> toReturn = new ArrayList<>();
        for (Course c : allCourses
                            .stream()
                            .filter(coursePredicate)
                            .toArray(Course[]::new)) {
            toReturn.add(c);
        }
        return toReturn;
    }
}

这意味着我们可以像这样调用它:

getCourses(c -> c.courseLevel != 'B');

意味着所有没有课程水平'B'将被退回...

这里发生了什么? 好。 首先,我们采用一个集合,并将其转换为“ Stream ”。 这允许我们使用Predicate (只是匹配的条件)来过滤流。 最后,我们可以将过滤后的Stream转换回数组,然后将这些元素添加回ArrayList

lambda定义了这个条件。 它只是一个接受类型为Course的单个参数的函数。 在我的例子中,它将等同于以下内容:

static boolean isMatch(Course c) {
    return c.courseLevel != 'B';
}

filter方法遍历Stream中的所有元素,如果应用Predicate (lambda,等同于上面的方法)返回true ,则它包含在其结果中。

我不知道你是否使用Java 8,但如果你使用Java 8,你可以使用流并过滤你的ArrayList。

语法可能如下所示:

return courseList.stream()。filter(c - > c.getCourseName()。equals(value));

您可以为byCourseName,byCourseLevel等设置单独的方法。主体将是相同的。

如果您不使用Java 8,您仍然可以使用单独的方法并避免使用交换机/案例。

如果你使用的是java 8,你可以使用Streams,特别是'filter'。 例如,请参阅本教程中的“过滤器”部分:http: //zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/

如果你只按名称过滤,那么你可以选择一个lambda表达式“filter(p - > p.getName()。equals(value))。但是因为你有一个更复杂的情况你最好调用一个专用的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM