Java 如何使用贴图修改流中的现有元素?
我有一个我搜索过的对象,这个对象存储在一个流中。我想让用户能够修改现有流中的元素,并用修改后的元素更新现有列表,而不是完全创建一个新列表。问题与此类似,只是用户正在将修改的元素添加到新列表中 这是我到目前为止所拥有的。我目前收到这个错误 运算符“+”不能应用于“void”、“void” 如果您需要完整的代码,或者包含其他类,请告诉我 主类Java 如何使用贴图修改流中的现有元素?,java,Java,我有一个我搜索过的对象,这个对象存储在一个流中。我想让用户能够修改现有流中的元素,并用修改后的元素更新现有列表,而不是完全创建一个新列表。问题与此类似,只是用户正在将修改的元素添加到新列表中 这是我到目前为止所拥有的。我目前收到这个错误 运算符“+”不能应用于“void”、“void” 如果您需要完整的代码,或者包含其他类,请告诉我 主类 else if (choice == 2){ System.out.println("\nEnter the name of
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);
});
通过这种方式,列表被修改到位。您已经编写了非常复杂的代码。两个观察结果:
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)});