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

And*_*llo 4 java generics arraylist

我有一个 Course 类,其中包含各种类型的字段,以及各自的 getter 和 setter,例如:

float percentage
char courseLevel
String courseName
boolean takingNow
Run Code Online (Sandbox Code Playgroud)

然后我有一个 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
}
Run Code Online (Sandbox Code Playgroud)

然后,该方法遍历课程的 ArrayList 并根据参数 ID 比较某个字段,如果课程字段等于传递的值,则将其添加到要返回的数组列表中。

有没有比以这种方式使用泛型更好的方法来做到这一点,我认为这是一种非常糟糕的编码实践。

Jos*_*lds 5

据我了解,您希望有一个方法可以返回与指定条件匹配的所有课程。

您可能会考虑研究 lambda...它们起初看起来有点时髦,但它们确实很强大,一旦您习惯了它就非常简单。

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着我们可以这样称呼它:

getCourses(c -> c.courseLevel != 'B');
Run Code Online (Sandbox Code Playgroud)

这意味着所有没有课程级别的学生都'B'将被退回......

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

lambda 定义了该条件。它只是一个接受单个类型参数的函数Course。在我的示例中,它相当于以下内容:

static boolean isMatch(Course c) {
    return c.courseLevel != 'B';
}
Run Code Online (Sandbox Code Playgroud)

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