Java 8 Java 8-嵌套在循环中

Java 8 Java 8-嵌套在循环中,java-8,java-stream,Java 8,Java Stream,因此,我有一个列表,对于列表中的每个项目,我必须根据每个列表元素“做点什么” 该列表由代码组成,共有5个代码。该列表可能包含任何或所有代码 到目前为止,我已经使用了forEach,并在其中编写了if条件,如下所示- List<Category> categories = getCategories(); categories.stream().forEach(category -> { if(category.equals(Category.A)) {

因此,我有一个列表,对于列表中的每个项目,我必须根据每个列表元素“做点什么”

该列表由代码组成,共有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
            }
        });
List categories=getCategories();
categories.stream().forEach(类别->{
if(类别等于(类别A)){
//做点什么
}else if(类别等于(类别B)){
//做点什么
}else if(类别等于(类别C)){
//做点什么
}else if(类别等于(类别D)){
//做点什么
}else if(类别等于(类别E)){
//做点什么
}
});

我正在考虑重构这个。有人能看看这能做得多好吗?

我唯一要改进的是使用switch语句:

switch(category){    
   case Category.A:
        // do Something
   break;
}

正如luk2302所提到的,这仅在类别为枚举时有效。

首先,不要使用多行lambda并创建新方法(带开关):

然后在lambda中使用它:

getCategories()
    .stream()
    .forEach(category -> doSomethingBasedOnCategory(category);

另一种方法是创建预先填充键(将是Category.X)和值(将是可以使用的函数)的静态映射。

您可以将
doSomething
方法添加到
Category
类中,只需在
.forEach
中调用它

例如:

public class Category {

    // any other methods/variable/constructors

    public void doSomething() {
        //do something
    }
}
然后你可以这样称呼它:

categories.stream().forEach(Category::doSomething);

如果
//doSomething
没有常见的行为,您可以将If部分移动到
doSomething
方法中。

您可以将
//doSomething
放在每个类别都覆盖的方法
void doSomething()
中,然后简单地编写
Category.doSomething()
。创建一个loopkup表。有关信息,请参阅。什么样的比较是
category.equals(category.A)
?@luk2302可能会写一个答案?这里也不需要创建流。集合接口有一个forEach方法如果
Category
只是一个普通类,而不是enum!?我想那就行不通了。作者并没有提供这方面的信息。值得一试。Category是一个枚举,因此这将起作用。我打算使用嵌套的if或开关,但我问这个问题的原因是为了看看是否有可能使用lambda函数来实现这一点。也可以使用方法引用
this::doSomethingBadeOnCategory
Category是一个枚举。我可以在enum类中编写登录名,但我希望保持逻辑分离。如果它是一个类,那么这肯定是我的实现。谢谢
categories.stream().forEach(Category::doSomething);