Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用贴图修改流中的现有元素?_Java - Fatal编程技术网

Java 如何使用贴图修改流中的现有元素?

Java 如何使用贴图修改流中的现有元素?,java,Java,我有一个我搜索过的对象,这个对象存储在一个流中。我想让用户能够修改现有流中的元素,并用修改后的元素更新现有列表,而不是完全创建一个新列表。问题与此类似,只是用户正在将修改的元素添加到新列表中 这是我到目前为止所拥有的。我目前收到这个错误 运算符“+”不能应用于“void”、“void” 如果您需要完整的代码,或者包含其他类,请告诉我 主类 else if (choice == 2){ System.out.println("\nEnter the name of

我有一个我搜索过的对象,这个对象存储在一个流中。我想让用户能够修改现有流中的元素,并用修改后的元素更新现有列表,而不是完全创建一个新列表。问题与此类似,只是用户正在将修改的元素添加到新列表中

这是我到目前为止所拥有的。我目前收到这个错误

运算符“+”不能应用于“void”、“void”

如果您需要完整的代码,或者包含其他类,请告诉我

主类

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

            Optional<Item> item = 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(item.toString());

            System.out.println("\nEnter the new datatype of the movie (Number): ");
            String userChoice = scan.nextLine();

            System.out.println("\nEnter the new name of the movie: ");
            String userChoice1 = scan.nextLine();

            System.out.println("\nEnter the new data ID for the movie (Number): ");
            int userChoice2 = scan.nextInt();
            scan.nextLine();

            System.out.println("\nEnter the new group for the movie: ");
            String userChoice3 = scan.nextLine();

            Collection::stream =
                    item.map(s -> s.setDataType(userChoice) + s.setName(userChoice1) + s.setData(userChoice2) + s.setGroup(userChoice3));
        }
item.map()
语句中,您正在调用setter,它返回void,因此您将得到问题。Void不是map方法的有效返回类型。+运算符也不能应用于无效操作数

两个观察结果

  • if(选项==2)
    • 在这里,您应该只执行一项任务来修改列表中的电影,如果列表中缺少电影,请通知用户
  • 项目类别
    包含
    列表
    • 现在不需要在Item类中添加项
    下面是我尝试的示例代码

    它在项目中查找用户输入的电影名称,并在其中进行修改 而不是创建一个全新的列表


    我看到,在main函数中,您要求用户提供电影的名称,然后提供要修改的字段。因此,在询问用户所有问题后,您可以使用以下操作:

    items.stream()
    //按名称搜索电影
    .filter(x->x.getName().equals(搜索))
    .findFirst()
    //如果存在,则对其进行修改
    .如果存在(i->{
    i、 setDataType(用户选择);
    i、 setName(userChoice1);
    i、 setData(用户选择2);
    i、 setGroup(用户选择3);
    i、 setItems(null);
    });
    

    通过这种方式,列表被修改到位。

    您已经编写了非常复杂的代码。两个观察结果:

  • 如果(choice==2),您应该只执行一项任务来修改列表中的电影,如果列表中缺少电影,则通知用户这一点,而不是添加它
  • Items类包含项的列表,现在不需要在Item类中添加项,除非这些是您希望在DB中持久化的实体类
  • 下面是代码片段,希望对您有所帮助

    items.getItem().stream().filter(x -> x.getName.equals(search)).forEach(x -> {x.setName(userInputName); x.setDatType(userInputDataType)});
    

    您可以发布项目类吗?@marc项目和项目类(以防万一)已发布供您参考,类
    项目
    参考类
    项目
    和类
    项目
    参考类
    项目
    。这被称为循环依赖,应该避免。该引用用于解析另一个对象中的嵌套对象。在这种情况下仍然不好吗?我尝试了这个,但是使用getter我无法输入用户输入作为参数,
    item.map(s->s.getDataType(userChoice)
    如果userChoice不是预期的参数,从功能上讲,你想实现什么?这一行的目的是什么?我试图修改流中元素的值。为此,用户必须首先输入新值。然后,必须收集这些值并映射到现有值上因此,将旧值修改为新用户输入的值。该特定行用于获取新用户输入,并将其传递给元素,以使其在观察的基础上进行更改1)如果(选项==2)此处您只需执行一项任务,即修改列表中的电影,如果列表中缺少电影,请通知用户。2) Items类包含列表,现在不需要在Item类中添加项。下面是我尝试过的示例代码,它在Items中找到了用户输入的电影名称,并在那里对其进行了修改,而不是创建一个全新的列表。希望它能帮到你。items.getItem().stream().filter(x->x.getName.equals(search)).forEach(x->{x.setName(userInputName);x.setDatType(userInputDataType)});非常感谢。我编辑了您的原始答案,并添加了注释中的代码。希望这能帮助其他可能遇到它的人:)我明白了,我之前发过一篇帖子,问什么是解决这个问题的最佳方法,并得到了使用map的建议,因此我采用了上面的方法。谢谢,我会试试看它是如何工作的。是的,一般来说,您可以使用
    map
    创建一个新列表,并使用
    forEach
    修改一个适当的列表。但是在您的情况下,只有一个元素需要修改,因此您可以使用
    findFirst
    ifPresent
    来代替
    forEach
    。我可能误解了您所说的只有一个元素需要修改的意思。该列表包含多个对象(电影),每个对象都包含我向用户请求的字段。因此,用户可以选择他们首先想要修改的电影,然后继续修改它,但是是的,一次只能修改一部电影。下面是指向我的链接,其中包含显示结构的xml文件
    import javax.xml.bind.annotation.XmlElement;
    
    public class Item {
        private String dataType;
        private String name;
        private int data;
        private String group;
        private Items items;
    
        @XmlElement
        public String getDataType(){
            return dataType;
        }
        public void setDataType(String dataType){
            this.dataType = dataType;
        }
    
        @XmlElement
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
    
        @XmlElement
        public int getData(){
            return data;
        }
        public void setData(int data){
            this.data = data;
        }
    
        @XmlElement
        public String getGroup(){
            return group;
        }
        public void setGroup(String group){
            this.group = group;
        }
    
        public Items getItems() {
            return items;
        }
    
        public void setItems(Items items) {
            this.items = items;
        }
    
        @Override
        public String toString() {
            return
                    "\n\tDataType: " + dataType +
                    "\n\tName: " + name +
                    "\n\tData: " + data +
                    "\n\tGroup: " + group +
                    "\n\tItems: " + items + "\n";
        }
    
        public String singleObject(){
            return
                    "\n\tDataType: " + dataType +
                    "\n\tName: " + name +
                    "\n\tData: " + data +
                    "\n\tGroup: " + group;
        }
    
    }
    
    . items.getItem().stream()  
    .filter(x -> x.getName.equals(search))
    .forEach(x -> {x.setName(userInputName); x.setDatType(userInputDataType)});
    
    items.getItem().stream().filter(x -> x.getName.equals(search)).forEach(x -> {x.setName(userInputName); x.setDatType(userInputDataType)});