Java 如何从流中删除对象

Java 如何从流中删除对象,java,Java,我的流中存储了x个数量的对象,用户可以搜索他们想要删除的对象。搜索后,我将对象及其元素打印到屏幕上,询问他们是否要删除该对象,并提示是/否确认。确认后,应删除对象,并再次打印项目流,不包括刚刚删除的项目(因为它已被删除lol)。 我遇到了一个问题,我的代码只是停止运行,在用户确认后不打印任何内容,我不知道为什么。我正在使用removeIf,因为根据研究,这是推荐的 主类 else if (choice == 3){ System.out.println("\nE

我的流中存储了x个数量的对象,用户可以搜索他们想要删除的对象。搜索后,我将对象及其元素打印到屏幕上,询问他们是否要删除该对象,并提示是/否确认。确认后,应删除对象,并再次打印项目流,不包括刚刚删除的项目(因为它已被删除lol)。
我遇到了一个问题,我的代码只是停止运行,在用户确认后不打印任何内容,我不知道为什么。我正在使用
removeIf
,因为根据研究,这是推荐的

主类

else if (choice == 3){
            System.out.println("\nEnter the name of the movie you would like to delete (Case Sensitive): ");
            String search = scan.nextLine();

            Optional<Item> optionalItemToRemove = items.stream()
                    .map(x->{
                        if(x.getItems()==null){
                            return Collections.singletonList(x);
                        }
                        x.getItems().getItem().add(x);
                        return x.getItems().getItem();
                    })
                    .flatMap(Collection::stream)
                    .filter(x -> x.getName().equals(search))
                    .peek(x-> x.setItems(null))//Peek exists mainly to support debugging
                    .findFirst();
            System.out.println(optionalItemToRemove.toString());

            System.out.println("Confirm Deletion? (Y/N)");
            String confirm = scan.nextLine();

            if (confirm.equalsIgnoreCase("y")){
            if (optionalItemToRemove.isPresent()) {
                items.removeIf(itemToCheck -> itemToCheck.equals(optionalItemToRemove));

                System.out.println(items);
           }
            else return;
        }
        else return;
项目类别

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "items")
public class Items {
    private List<Item> item;

    @XmlElement(name = "item")
    public List<Item> getItem(){
        return item;
    }

    public void setItem(List<Item> itemList){
        this.item = itemList;
    }

    @Override
    public String toString() {
        return "\n" + item ;
    }
}
import javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入java.util.List;
@XmlRootElement(name=“items”)
公共类项目{
私人清单项目;
@xmlement(name=“item”)
公共列表getItem(){
退货项目;
}
公共无效集合项(列表项列表){
this.item=itemList;
}
@凌驾
公共字符串toString(){
返回“\n”+项;
}
}

您有一个名为
项目的
可选
,其中包含用户要删除的项目(如果
搜索
与任何项目的名称不匹配,则可能是空的
可选
)。
的更好名称是
选项项删除
,以明确其用途

您有一个名为
项目的
列表
,您想从中删除
项目

我们只想在可选项实际包含一项时执行此操作,因此我们可以说:

if (item.isPresent()) {
  // remove the item
  // because we know the item is present we can safely call item.get() to get the actual Item inside the Optional
}
要删除项目,我们可以使用
items.removeIf(…)

removeIf
的参数是一个
谓词
。该函数对
列表中的每个项目调用一次,如果要删除该项目,则返回
true
,如果要保留该项目,则返回
false

我们想要删除存储在Optional中的项,因此我们需要编写一个函数,如果传递给它的项是Optional中的项,则该函数将返回true

想一想,看看你是否能写出那个函数,即

items.removeIf(itemToCheck -> ...)
省略号所在的位置需要一个表达式,用于检查itemToCheck是否是要删除的项

请让我们知道,如果这个答案中有部分您没有遵循


尝试阅读Javadoc以了解所使用的函数,并编写一些小的测试程序来帮助您理解它们的功能。在你完全理解它的功能之前,理解一个非常小的程序是如何工作的要比在你的大程序中使用它容易得多。

if(confirm==“y”| | confirm==“y”)
->
if(confirm.equalsIgnoreCase(“y”)
。你能解释一下你认为removeIf做了什么吗?调用removeIf后,能否使用调试器查看项目列表中的内容?如果条件为true,则调试器应删除列表中的所有元素。这就是我的理解atleast@tgdaviesitems list在removeIf调用后的值为0。为了精确起见,它计算谓词(从列表中获取项并返回true或false的函数)并删除谓词返回true的任何项。您的谓词是
item->true
。哪些项目的结果为真?我对你的意思有一个大致的了解。我不确定在哪里调用item.get()。对于删除过程,我有一个
items.removeIf(itemToCheck->itemToCheck.equals(optionalintemtoremove))此操作的结果不会删除我希望它删除的项,但我确实知道它在某种程度上起作用,因为我可以看到在调试程序时正在收集我想要的项。如果(item.isPresent())
未被识别,我使用了
如果(optionalItemToRemove.isPresent())
不确定这是否会导致错误请使用当前代码更新您的问题。
items.removeIf(itemToCheck -> ...)