【问题标题】:Questions about this bit of Java code, why it is written as it is关于这段 Java 代码的问题,为什么要这样写
【发布时间】:2019-03-13 16:41:27
【问题描述】:

我遇到了这个源代码,并想确保我理解它为什么按原样编写(或者是否应该这样编写):

boolean modified = false;
Set<String> possibleSites = settings.getPossibleSites();
Set<String> visibleSites = settings.getVisibleSites();
modified = someMysteriousMethod();

// Remove sites from visibleSites that are not in possibleSites
modified |= visibleSites.retainAll(possibleSites);

我对 LAST 语句的问题:

  1. 为什么要使用位运算符? retainAll() 将返回一个关于发生了什么的布尔值?

  2. 运算符/语句在说什么?如果 modified 等于返回值,则保留 modified 的值,或者如果返回值不同,则将修改为该新值?

【问题讨论】:

标签: java set bitwise-or


【解决方案1】:
boolean retainAll(Collection<?> c)

如果the set changed as a result of the call返回true

modified |= visibleSites.retainAll(possibleSites);

所以上面的语句意味着,如果modifiedtrue OR retainAll返回true,那么modified被设置为true,否则modified的值为false

【讨论】:

    【解决方案2】:

    这意味着如果modifiedretainAll() 为真,那么modified 应该为真。 (根据名称,这很有意义。retainAll 仅在 Set 更改时返回 true,someMysteriousMethod 可能返回 true 或 false,具体取决于 Set 的状态是否更改。)

    代码分解为:

    modified = modified | visibleSites.retainAll(possibleSites);
    

    看下面的代码,看看|在布尔值上的结果:

    System.out.println(true|true);
    System.out.println(false|true);
    System.out.println(true|false);
    System.out.println(false|false);
    

    输出:

    true
    true
    true
    false
    

    (只有false|false 会返回false,所以在代码中,modifiedretainAll 都必须返回false,modified 才能成为false

    【讨论】:

      【解决方案3】:

      retainAll method in Set的返回值表示集合是否被调用改变。

      返回:

      true 如果此集合因调用而改变

      这里,true 表示该集合已被修改。 |= 复合运算符对参数执行“或”并将其分配回左侧。对于您的情况,这意味着如果retainAll 返回true,则将true 分配回modified,否则保持modified 不变。

      【讨论】:

        【解决方案4】:

        根据javadoc,

        retainAll retuns true 如果该集合因调用而改变

        a |= b 是影响“a or b”到a 的结果的操作。 因此,在您的情况下,想法是将语句的结果影响到modifiedvisibleSitesORvisibleSitesretainAll修改之前被修改”

        【讨论】:

          【解决方案5】:

          之后:

          修改 = someMysteriousMethod();

          那么modified 可能是真的,也可能不是。 效果如下:

          已修改 |= visibleSites.retainAll(possibleSites);

          是让modified如果已经为真则设置为真,如果其他条件成立则将其从假改为真(我故意说效果,我不是在描述实际的指令操作)。

          第二个语句可以写成

          if (visibleSites.retainAll(possibleSites)) {
                modified = true;
          }
          

          同样的结果。在某种程度上,这是一个品味问题。我发现原文(使用|= 运算符)更易于阅读,因为它是一个简单的直线逻辑表达式,而不是控制流语句

          顺便说一句,它不称为“按位”运算符。 Java有两个'|'和两个对应的 '|=' 运算符;整数之间是bitwise-or,布尔值之间是logical-or

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-05
            • 2023-03-09
            • 2011-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多