将泛型列表Java中的所有布尔对象设置为false?

时间:2019-01-17 11:01:02

标签: java list boolean

我有以下类型的列表

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,而不循环遍历列表。

如何实现?

4 个答案:

答案 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编译器,那么将其优化为非常紧凑的本机代码非常简单。