Java 8 - 如果在循环内嵌套

时间:2017-11-02 12:54:37

标签: java-8 java-stream

所以我有一个列表,对于列表中的每个项目,我必须根据每个列表元素“做某事”。

该列表由代码组成,共有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
            }
        });

我正在考虑重构这个。有人可以看看这有多好吗?

3 个答案:

答案 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