我有一个课程类,其中包含各种类型的字段,以及各自的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中。
有没有比使用泛型更好的方法,我觉得这是一个非常糟糕的编码实践。
答案 0 :(得分:4)
据我了解,您希望有一个方法可以返回符合指定条件的所有课程。
你可能会考虑调查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'
的人将被退回...
这里发生了什么?好。首先,我们采用一个集合,并将其转换为&#34; Stream
&#34;。这允许我们使用Predicate
s(只是匹配的条件)来过滤流。最后,我们可以将已过滤的Stream
转换回数组,然后将这些元素添加回ArrayList
。
lambda定义了这个条件。它只是一个接受Course
类型的单个参数的函数。在我的例子中,它将等同于以下内容:
static boolean isMatch(Course c) {
return c.courseLevel != 'B';
}
filter
方法遍历Stream
中的所有元素,如果应用Predicate
(lambda,等同于上述方法),则返回true
,它&# 39; s包括在其结果中。
答案 1 :(得分:2)
我不知道您是否正在使用Java 8,但如果您使用Java 8,则可以使用流并过滤您的ArrayList。
语法可能如下所示:
return courseList.stream()。filter(c - &gt; c.getCourseName()。equals(value));
你可以为byCourseName,byCourseLevel等设置一个单独的方法。主体是相同的。
如果您不使用Java 8,您仍然可以使用单独的方法并避免使用交换机/案例。
答案 2 :(得分:0)
如果你正在使用java 8,你可以使用Streams,特别是&#39; filter&#39; 。例如,参见&#39;过滤器&#39;本教程中的部分:http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/
如果您只按名称过滤,那么您可以选择lambda表达式&#34;过滤器(p - &gt; p.getName()。equals(value))。但是,由于你有一个更复杂的案例,你最好不要调用一个专门的方法。