为了账号安全,请及时绑定邮箱和手机立即绑定

如何修改列表中的对象<?迭代时扩展 MyObject>?

如何修改列表中的对象<?迭代时扩展 MyObject>?

叮当猫咪 2022-04-28 15:41:19
我正在尝试修改列表中选择对象中的字段,但我无法找到这样做的方法,使用普通的迭代器,因为它没有set()方法。我尝试使用提供set()方法的 ArrayListIterator,但这会引发转换异常。有没有办法解决这个问题?   Iterator it = topContainer.subList.iterator();   while (it.hasNext()) {      MyObject curObj = (MyObject) it.next();      if ( !curObj.getLabel().contains("/") ) {           String newLabel = curObj.getLabel() + "/";           curObj.setLabel(newLabel);           ((ArrayListIterator) it).set(curObj)       }    }我希望列表中的原始当前对象可以顺利设置,但我得到了这个异常:java.util.ArrayList$itr 不能转换为 org.apache.commons.collections.iterators.ArrayListIterator完成我想做的事情的正确方法是什么?
查看完整描述

3 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

你根本不需要打电话set。你可以setLabel打电话curObj:


// please, don't use raw types!

Iterator<? extends MyObject> it = topContainer.subList.iterator();

while (it.hasNext()) {

   MyObject curObj = it.next();

   if ( !curObj.getLabel().contains("/") ) {

       String newLabel = curObj.getLabel() + "/";

       curObj.setLabel(newLabel);

   }

}


查看完整回答
反对 回复 2022-04-28
?
湖上湖

TA贡献2003条经验 获得超2个赞

正确的方法如下(不适用于 1.5 以下的 java 版本):


for(MyObject curObj : topContainer.subList){

    if (!curObj.getLabel().contains("/")) {

       String newLabel = curObj.getLabel() + "/";

       curObj.setLabel(newLabel);

    }

}

这是一个增强的 for 循环,它也调用了迭代器,但是你看不到它。


也不需要通过迭代器设置对象,因为您Object在 Java 中使用对 s 的引用,当您编辑对象时,每个拥有指向该对象的指针的人也会看到更改。有关更多信息,您可以阅读这篇精彩的文章:Java 是“按引用传递”还是“按值传递”?


如果您不能使用 Java 5,那么您将错失良机。当前的 java 版本是11。所以你应该真的,真的,真的,升级你的JDK


查看完整回答
反对 回复 2022-04-28
?
森林海

TA贡献2011条经验 获得超2个赞

你只需要设置标签。在 JAVA 11 中,您可以使用流。它使您的代码更具可读性。


List<MyObject> list = topContainer.subList;

list

    .stream()

    .filter(Predicate.not(e->e.getLabel().contains("/")))

    .forEach(e->e.setLabel(e.getLabel()+"/"));

在 Java 8 中,您可以使用


(!e->e.getLabel().contains("/"))


代替


Predicate.not(e->e.getLabel().contains("/")


查看完整回答
反对 回复 2022-04-28
  • 3 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信