我有以下类型的列表
public class Tag{
boolean selected;
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
String title;
String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
创建列表如下
List<Tag> brandList = new ArrayList<>();
brandList.add(new Tag("1","A",false));
brandList.add(new Tag("2","v",true));
brandList.add(new Tag("3","f",false));
brandList.add(new Tag("4","g",true));
brandList.add(new Tag("5","y",true));
brandList.add(new Tag("6","e",true));
brandList.add(new Tag("7","r",false));
brandList.add(new Tag("18","y",true));
brandList.add(new Tag("16","j",true));
brandList.add(new Tag("19","m",false));
我想将列表中选定对象的所有值设置为false,而不循环遍历列表。
如何实现?
答案 0 :(得分:9)
没有迭代就无法做到。如果要避免传统循环,仍可以使用forEach
:
brandList.forEach(brand -> brand.setSelected(false));
答案 1 :(得分:3)
您显然需要遍历列表。没有内存设置机制可以允许这种微妙之处,特别是考虑到对象之间的存储空间不是很近。
但是,如果您不想自己编写它,请使用forEach():
brandList.forEach(tag -> tag.setSelected(false));
答案 2 :(得分:0)
有一种方法可以让您无需重复每个对象。
请注意:这是一种肮脏,hacky且相当复杂的方式。如果已实施,则应仅通过selected
访问isSelected()
值(这是封装的一般要求)。
您应该真正对其进行迭代,但是为了进行实验,我为您提供了一个“解决方案”。
现在我将免责声明放在首位:
创建一个对象“ Switch”,您可以将其赋予所有对象,该类应类似于:
class Switch {
private boolean switchedOff = false;
private LocalDateTime lastSwitchOff;
public boolean isSwitchedOff() {
return switchedOff;
}
public void switchOff() {
switchedOff = true;
lastSwitchOff = LocalDateTime.now();
}
public LocalDateTime getLastSwitchOff() {
return lastSwitchOff;
}
}
关闭开关后,isSelected()
对象的所有Tag
调用都将返回false,除非您再次进行设置。这是将其添加到Tag
类中的方式:
public class Tag {
private final String title;
private final String id;
private boolean selected;
private Switch theSwitch;
private LocalDateTime lastModified;
public boolean isSelected() {
if (theSwitch != null && theSwitch.isSwitchedOff() && lastModified.isBefore(theSwitch.getLastSwitchOff())) return false;
else return selected;
}
public void setSelected(boolean selected) {
lastModified = LocalDateTime.now();
this.selected = selected;
}
public Tag(String id, String title, boolean selected, Switch theSwitch) {
lastModified = LocalDateTime.now();
this.id = id;
this.title = title;
this.selected = selected;
this.theSwitch = theSwitch;
}
...
}
然后您可以通过以下方式使用它:
public static void main(String[] args) {
Switch mySwitch = new Switch();
List<Tag> brandList = new ArrayList<>();
brandList.add(new Tag("1", "A", false, mySwitch));
brandList.add(new Tag("2", "v", true, mySwitch));
brandList.add(new Tag("3", "f", false, mySwitch));
brandList.add(new Tag("4", "g", true, mySwitch));
brandList.add(new Tag("5", "y", true, mySwitch));
brandList.add(new Tag("18", "y", true, mySwitch));
brandList.add(new Tag("16", "j", true, mySwitch));
brandList.add(new Tag("19", "m", false, mySwitch));
mySwitch.switchOff();
// Now all of the isSelected() calls will return false
}
答案 3 :(得分:0)
您在错误的前提下工作:
@Stultuske,这只是有限的数据,实际列表可以包含600-700个对象
您可以循环播放数十万个对象,并且很可能甚至不会花费超过一两秒的CPU时间。正如一位评论者所说,“ 600-700算不了什么。”
话虽如此,如果原始速度是您想要的,这是最好的方法:
for (int index = 0; index < list.size(); index++) {
Tag x = list.get(index);
x.setBooleanValue(false);
}
原始循环比“ foreach”(对于y中的x或forEach)更好,因为每次迭代都没有调用任何方法。如果JVM需要调用JIT编译器,那么将其优化为非常紧凑的本机代码非常简单。