所以我有一个列表,对于列表中的每个项目,我必须根据每个列表元素“做某事”。
该列表由代码组成,共有5个代码。该列表可能包含任何或所有代码。
到目前为止,我已经使用了forEach,并且我已经在其中写了if条件,如下所示 -
List<Category> categories = getCategories();
categories.stream().forEach(category -> {
if(category.equals(Category.A)) {
// do something
} else if(category.equals(Category.B)) {
// do something
} else if(category.equals(Category.C)) {
// do something
} else if(category.equals(Category.D)) {
// do something
} else if(category.equals(Category.E)) {
// do something
}
});
我正在考虑重构这个。有人可以看看这有多好吗?
答案 0 :(得分:1)
我唯一要改进的是使用switch语句:
switch(category){
case Category.A:
// do Something
break;
}
正如luk2302所提到的,只有在类别是枚举的情况下,这才有效。
答案 1 :(得分:1)
您可以在doSomething
课程中添加Category
方法,只需在.forEach
中进行调用即可。
例如:
public class Category {
// any other methods/variable/constructors
public void doSomething() {
//do something
}
}
然后你可以这样称呼它:
categories.stream().forEach(Category::doSomething);
如果// do something
没有共同的行为,您可以在doSomething
方法中移动if部分。
答案 2 :(得分:0)
首先,不要使用多行lambdas并创建新方法(使用 switch ):
private void doSomethingBasedOnCategory(Category category) {
switch(category) {
case A: // do something
break;
case B: // do something
break;
case C: // do something
break;
case D: // do something
break;
case E: // do something
break;
}
}
然后在你的lambda中使用它:
getCategories()
.stream()
.forEach(category -> doSomethingBasedOnCategory(category);
另一种方法是创建预先填充了密钥(将是Category.X)和值(将成为可以使用的函数)的静态 map