如何使用java流计算掩码

Riw*_*rbs 9 java java-stream

我有这个代码。这是地图Map<Data, Boolean>

int mask = 0;
for (Map.Entry<Data, Boolean> entry : map.entrySet()) {
  if (entry.getKey().getValue() > 0 && entry.getValue()) {
    mask = mask | (1 << (entry.getKey().getValue() - 1));
  }
}
Run Code Online (Sandbox Code Playgroud)

我想使用 Java 流计算掩码。在这里,我试图但只得到然后过滤列表。不知道这里如何计算掩码。

Integer mask = map.entrySet().filter( entry -> entry.getKey().getValue() > 0 && entry.getValue()).?
Run Code Online (Sandbox Code Playgroud)

Jak*_* Em 12

您可以将您的条目映射到计算出的值,然后or在 reduce 运算符中应用:

map.entrySet().stream()
       .filter(entry -> entry.getValue() && entry.getKey().getValue() > 0)
       .mapToInt(entry -> (1 << (entry.getKey().getValue() - 1)))
       .reduce(0, (r, i) -> r | i)
Run Code Online (Sandbox Code Playgroud)

编辑:如果映射为空,则将 0 作为标识元素添加到缩减操作以具有默认值 0。

Edit2:正如评论中所建议的,我颠倒了过滤顺序以避免不必要的方法调用

Edit3:正如评论中所建议的,mapToInt现在使用

  • 注意“mapToInt”的存在。 (5认同)
  • 很好的解决方案。这很简单,但我会反转过滤器以首先检查布尔值。然后,除非布尔值为 true,否则您可以避免双重方法查找。 (4认同)

Vin*_*gde 6

你可以试试这个,但正如 Aniket 上面所说的,mask改变使用 Strem 并不是一个好主意。

map.entrySet().filter( entry -> entry.getKey().getValue() > 0 && entry.getValue()).forEach(k->{mask=mask | (1 << (k.getKey().getValue() - 1))});
Run Code Online (Sandbox Code Playgroud)