簡體   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