Java 将项目列表分为新项目、当前项目和当前项目,并需要对其进行处理

Java 将项目列表分为新项目、当前项目和当前项目,并需要对其进行处理,java,arraylist,coding-style,code-cleanup,Java,Arraylist,Coding Style,Code Cleanup,我的数据库中有我想要的项目列表。一些项目是新的,必须保存,其他项目已经在数据库中,但必须更新,一些需要更新的项目可能有资格获得特殊待遇 现在我只需运行它们,并根据它们的属性将它们放在其他列表中,然后将列表交给相应的数据库(或特殊)方法来处理它 我只是觉得它不漂亮,它做的有点多,它有嵌套的if。 但我真的想不出更好的方法 下面是(稍微简化的)代码 List newItemList=newarraylist(); List existingItemList=新建ArrayList(); List s

我的数据库中有我想要的项目列表。一些项目是新的,必须保存,其他项目已经在数据库中,但必须更新,一些需要更新的项目可能有资格获得特殊待遇

现在我只需运行它们,并根据它们的属性将它们放在其他列表中,然后将列表交给相应的数据库(或特殊)方法来处理它

我只是觉得它不漂亮,它做的有点多,它有嵌套的if。 但我真的想不出更好的方法

下面是(稍微简化的)代码

List newItemList=newarraylist();
List existingItemList=新建ArrayList();
List specialItemList=new ArrayList();
用于(项目:项目)
{
if(item.isNew())
{
newItemList.add(项);
}
其他的
{
if(item.isSpecial())
{
特殊列表添加(项目);
}
existingItemList.add(项目);
}
}
itemHandler.saveItems(newItemList);
updateItems(existingItemList);
specialManager.specialStuff(speciallitemlist);

尝试创建另一种方法,如:

boolean add(List<Item> items, Item item, boolean doAdd) {
    if (doAdd) {
        items.add(item);
    }
}

尝试创建另一种方法,如:

boolean add(List<Item> items, Item item, boolean doAdd) {
    if (doAdd) {
        items.add(item);
    }
}

使用Java 8,您可以通过按状态(新的或现有的)对
列表进行分组来简化
枚举可以表示以下状态:
enum state{NEW,EXISTING}
,而
Item
类应该声明一个
state getState()
方法

Map<ItemState, List<Item>> itemListByState  = 
                   items.stream()
                         .collect(Collectors.groupingBy(Item::getState));

itemHandler.saveItems(itemsByState.get(State.NEW));
itemHandler.updateItems(itemsByState.get(State.EXISTING));
specialManager.specialStuff(itemsByState.get(State.EXISTING).stream()
                                        .filter(Item::isSpecial)
                                        .collect(Collectors.toList()));
Map itemListByState=
items.stream()
.collect(Collectors.groupingBy(Item::getState));
saveItems(itemsByState.get(State.NEW));
updateItems(itemsByState.get(State.EXISTING));
specialManager.specialStuff(itemsByState.get(State.EXISTING.stream)()
.过滤器(项目::isSpecial)
.collect(Collectors.toList());

当然,您可以为
列表
引入中间变量,但我认为这并不是必需的,它可以减少它们之间潜在的副作用。

使用Java 8,您可以通过按状态(新的或现有的)对
列表
进行分组来简化。
枚举可以表示以下状态:
enum state{NEW,EXISTING}
,而
Item
类应该声明一个
state getState()
方法

Map<ItemState, List<Item>> itemListByState  = 
                   items.stream()
                         .collect(Collectors.groupingBy(Item::getState));

itemHandler.saveItems(itemsByState.get(State.NEW));
itemHandler.updateItems(itemsByState.get(State.EXISTING));
specialManager.specialStuff(itemsByState.get(State.EXISTING).stream()
                                        .filter(Item::isSpecial)
                                        .collect(Collectors.toList()));
Map itemListByState=
items.stream()
.collect(Collectors.groupingBy(Item::getState));
saveItems(itemsByState.get(State.NEW));
updateItems(itemsByState.get(State.EXISTING));
specialManager.specialStuff(itemsByState.get(State.EXISTING.stream)()
.过滤器(项目::isSpecial)
.collect(Collectors.toList());

当然,您可以为
列表
引入中间变量,但我认为这并不是必需的,它可以减少它们之间潜在的副作用。

您当前的代码正是必需的。您的需求需要三个不同的列表,您迭代项目一次以创建它们。这是最有效的方法。您可以用三行代码编写代码-请参见下文-(helper方法是为了清楚起见)-但是您可以迭代项目三次(但不需要3个列表)。我相信任何试图使“更好”的代码失去一些优化

itemHandler.saveItems(createList(items, i -> i.isNew()));
specialManager.specialStuff(createList(items, i -> !i.isNew() && i.isSpecial()));
itemHandler.updateItems(createList(items, i -> !i.isNew()));
助手方法:

public List<Item> createList(List<Item> allItems, Predicate<Item> p) {
    return allItems.stream().filter(p).collect(Collectors.toList());
}
公共列表createList(列表所有项,谓词p){
返回allItems.stream().filter(p.collect)(Collectors.toList());
}

您当前的代码完全符合要求。您的需求需要三个不同的列表,您迭代项目一次以创建它们。这是最有效的方法。您可以用三行代码编写代码-请参见下文-(helper方法是为了清楚起见)-但是您可以迭代项目三次(但不需要3个列表)。我相信任何试图使“更好”的代码失去一些优化

itemHandler.saveItems(createList(items, i -> i.isNew()));
specialManager.specialStuff(createList(items, i -> !i.isNew() && i.isSpecial()));
itemHandler.updateItems(createList(items, i -> !i.isNew()));
助手方法:

public List<Item> createList(List<Item> allItems, Predicate<Item> p) {
    return allItems.stream().filter(p).collect(Collectors.toList());
}
公共列表createList(列表所有项,谓词p){
返回allItems.stream().filter(p.collect)(Collectors.toList());
}

在我个人看来:应该这样做。在我个人看来:应该这样做。He我的一位同事可能会喜欢这个答案:D我不喜欢,但无论如何谢谢你的回馈。我理解你的选择。我也喜欢很多答案。呵呵,我的一位同事可能会喜欢这个答案:D我不喜欢,但无论如何谢谢汉克斯的回馈。我理解你的选择。我也喜欢很多答案。我喜欢很多你的答案,解释很好:清晰与优化。我投你一票:)我很喜欢你的答案,解释很好:清晰还是优化。我投你一票:)